Tableau 2 dimensions

Petit nouveau ! | 1 Messages

30 janv. 2013, 19:06

Bonjour à tous

Je cherche à balayer un tableau à deux dim mais je peine un peu..

J'ai des marques composées de modèles

Dans l'exemple ci-après

J'ai juste 2 marques et un modèle.

Voila mon code
$marques_sql=Doctrine_Core::getTable('Marque')->getmarques();

$tab=array();
$i=0;
foreach($marques_sql as $marque){
$tab[$i]['id']=$marque['id'];
$tab[$i]['marque']=$marque['marque'];

$modeles_sql=Doctrine_Core::getTable('Modele')->getbymarque($marque['id']);
$j=0;

foreach($modeles_sql as $mod){
	$tab[$i][$j]['id']=$mod['id'];
	$tab[$i][$j]['mod']=$mod['modele'];
	$j++;
}

$i++;
}

après un var_dump j'obtiens ca :

Code : Tout sélectionner

array 0 => array 'id' => string '1' (length=1) 'marque' => string 'peugeot' (length=7) 0 => array 'id' => string '2' (length=1) 'mod' => string '406' (length=3) 1 => array 'id' => string '2' (length=1) 'marque' => string 'renault' (length=7)
et bizarrement quand je balaye mes datas:
foreach($tab as $marque){
	echo $marque['marque'];
foreach($marque as $modele){
	echo $modele['mod'];	
}

}
j'obtiens ceci :

marque :peugeot
modele :1p406

renault
2r

Merci pour votre aide

ViPHP
xTG
ViPHP | 7331 Messages

30 janv. 2013, 21:03

Ton code de balayage ne reflète pas l'affichage que tu nous donnes.
Pas de echo 'marque', pas de echo 'modèle'.
On ne peut donc te dire ce qui ne va pas, car ton code de balayage tel que tu nous le présente est tout à fait correct.

xpdesignstudio2
Invité n'ayant pas de compte PHPfrance

30 janv. 2013, 23:11

en effet

bizarrement, voila ce qu'il ressort alors que je n'ai que deux marques et un modèle


le balayage :
foreach($tab as $marque){
        echo 'marque : ' .$marque['marque'].  "<br />";
foreach($marque as $modele){
        echo 'modele : ' .$modele['name'].  "<br />"; 
}

}
donne :

marque : peugeot
modele : 1
modele : p
modele : 406
marque : renault
modele : 2
modele : r

encore une fois le var_dump affiche pourtant ceci :

Code : Tout sélectionner

0 => array 'id' => string '1' (length=1) 'marque' => string 'peugeot' (length=7) 0 => array 'id' => string '2' (length=1) 'name' => string '406' (length=3) 1 => array 'id' => string '2' (length=1) 'marque' => string 'renault' (length=7)

ViPHP
xTG
ViPHP | 7331 Messages

31 janv. 2013, 09:36

Mea culpa ta boucle était bien incorrecte...
Le souci qu'on observe est que dans $marque tu as bien les index numériques mais aussi les index alphanumériques !
Et ensuite on a une drôle d'interprétation de l'index name alors qu'il n'existe pas toujours, name doit être converti en entier pour accéder à la variable de type String et est tout simplement converti en 0.
foreach($tab as $marque){
        echo 'marque : ' .$marque['marque'].  "<br />";
foreach($marque as $key => $modele){
  if( is_numeric($key) )
        echo 'modele : ' .$modele['name'].  "<br />";
}

}

ViPHP
ViPHP | 2577 Messages

31 janv. 2013, 10:32

Bonjour,

Je pense que tu devrais utiliser des objets.

un objet modele avec comme propriété id, nom
Un objet marque avec comme propriété id, nom et un tableau de modèle

Je pense que ca simplifierai ta gestion des données.

Si tu veux travailler uniquement avec des tableaux, utilise plutot :

$tab[$i]['id']=$marque['id'];
$tab[$i]['marque']=$marque['marque'];
$tab[$i]['modeles']=array(); // Pas de modèle renseigné au début
et ensuite
$tab[$i]['modeles'][$j]['id']=$modele['id'];
$tab[$i]['modeles'][$j]['mod']=$modele['mod'];