Pas besoin d'utiliser les fonctions array_*
Il s'agit de créer un tableau multidimensionnel, vois-le comme un répertoire avec des fichiers...
Voici la fonction pour ajouter un type, à toi de t'en inspirer pour ajouter une marque ou un modèle (ou plus exactement vu que marque et modèles sont des tableaux inspire-toi de ce qui suit

)
function mon_type($TypeAAjouter, $Model, $Marque, $map) {
$map['Voiture'][$Marque][$Model]=$TypeAAjouter;
return $map;
}
$map=[];
$map = mon_type("Type 1", "Clio", "Renault", $map);
var_dump($map);
Cette fonction renvoie exactement ce que tu dois obtenir, toutefois je pense qu'il y a une erreur dans l'énoncé car cela veut dire que pour un modèle tu ne peux avoir qu'un seul type.
A mon sens, il faudrait que type soit un tableau et non pas un string afin de pouvoir en ajouter plusieurs.
Du coup, pour pouvoir ajouter plusieurs types ça donnerait qqch comme ça :
function mon_type($TypeAAjouter, $Model, $Marque, $map) {
$map['Voiture'][$Marque][$Model][]=$TypeAAjouter;
return $map;
}
Et si on veut améliorer, on peut aussi vérifier que le type n'existe pas déjà avant de l'ajouter afin d'éviter les doublons :
function mon_type($TypeAAjouter, $Model, $Marque, $map) {
if (!@in_array($TypeAAjouter, $map['Voiture'][$Marque][$Model]))
$map['Voiture'][$Marque][$Model][]=$TypeAAjouter;
return $map;
}