Parcourir un tableau à n dimensions

Eléphant du PHP | 363 Messages

29 sept. 2009, 14:52

Bonjour,

Il est difficile de faire la part des choses entre le niveau débutant et avancé surtout quand c'est son premier message. Quelque soit votre intervention elle sera la bienvenue.

Je cherche à parcourir un tableau à n dimensions, disons 4 pour l'exemple (je sais pas si c'est viable) et d'afficher tous les enregistrements, un peu comme le fameux :
echo("<pre>");
print_r($mon_tableau);
echo("</pre>");
Jeune demoiselle recherche un mec mortel :love7: , non mais ca va pas lol !!! :axe:

foetus69
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

29 sept. 2009, 15:19

Bonjour et bienvenue sur PHPFrance.

La fonction de base pour parcourir un tableau, c'est foreach().
foreach($tableau as $key => $value)
{
  echo $key.'-'.$value.'<br />';
}
Ensuite, si tu veux parcourir plusieurs niveau dans ce tableau, il faut imbriquer les foreach()
foreach($tableau as $key => $value)
{
  foreach($value as $key1 => $value1)
  {
    foreach($value1 as $key2 => $value2)
    {
      //...
    }
  }
}
Là où ça se complique un peu, c'est si tu ne connais pas la profondeur de ton tableau.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 sept. 2009, 15:28

Bonjour,
si tu veux parcourir plusieurs niveau dans ce tableau, il faut imbriquer les foreach()
foreach($tableau as $key => $value)
{
  foreach($value as $key1 => $value1)
  {
    foreach($value1 as $key2 => $value2)
    {
      //...
    }
  }
}
Là où ça se complique un peu, c'est si tu ne connais pas la profondeur de ton tableau.
Pour compléter la réponse de Zeus, si tu ne connais pas la profondeur alors il faut faire de la récursivité :
function afficher_tablo($tableau) {
    foreach($tableau as $key => $value) {
        if (is_array($value)) {
                afficher_tablo($value);
        }else{
                print $value."<br />";
        }
    }
}

$mon_beau_tablo=array("1a", array("2a","2b", array("3a")));

afficher_tablo($mon_beau_tablo);
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 363 Messages

29 sept. 2009, 16:25

Génial ! A peine poster que déjà j'ai des réponses :D

Merci, merci beaucoup :love7:

Il ne me reste plus qu'à gérer non pas la profondeur mais le colonage de chaque array et c'est bon, quoique 8-|

C'est de l'ordre du débutant ma demande ?

In utero (c'est mon côté grunge qui parle :))
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Eléphant du PHP | 369 Messages

30 sept. 2009, 15:45

Salut,
Génial ! A peine poster que déjà j'ai des réponses :D
Merci, merci beaucoup :love7:
Il ne me reste plus qu'à gérer non pas la profondeur mais le colonage de chaque array et c'est bon, quoique 8-|
C'est de l'ordre du débutant ma demande ?
In utero (c'est mon côté grunge qui parle :))
Tu peux aussi tiliser cette class... :

vos-contributions/hierarchie-array-obje ... 49534.html

'fin ce que j'en dis, je dis rien ;)

@+ bon code ;)

Eléphant du PHP | 363 Messages

30 sept. 2009, 20:23

Bonjour et merci fuZZyline, mais la POO c'est trop touchy pour moi pour le moment :lol:

Par contre je voudrais bien un coup de main pour réussir à parcourir les colonnes de mon array du 4ème niveau pour en ressortir un voir tous les enregistrements.

J'ai écrit un $key5[$i] par le biais d'un for mais je n'obtiens que le nom de la première colonne à savoir id que j'avais alimenté de cette façon :
$table['lvl1'][][$v] = array (
    "id" => $v2)
et ca ne m'écrit que des id, id, id (l'index en quelque sorte) alors que je voudrais la valeur associée c'est à dire $v2.

Tu vois ce que je veux dire ?

f69 #-o
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Eléphant du PHP | 369 Messages

30 sept. 2009, 20:50

Re,
Bonjour et merci fuZZyline, mais la POO c'est trop touchy pour moi pour le moment :lol:

Par contre je voudrais bien un coup de main pour réussir à parcourir les colonnes de mon array du 4ème niveau pour en ressortir un voir tous les enregistrements.

J'ai écrit un $key5[$i] par le biais d'un for mais je n'obtiens que le nom de la première colonne à savoir id que j'avais alimenté de cette façon :
$table['lvl1'][][$v] = array (
    "id" => $v2)
et ca ne m'écrit que des id, id, id (l'index en quelque sorte) alors que je voudrais la valeur associée c'est à dire $v2.

Tu vois ce que je veux dire ?

f69 #-o
@rthur et zeus ont répondus enfaite s'agit d'en placer autant que tu veux de foreach
encapsulés. Sinon tu as cette solution mais pas le temps alors surement des erreurs, dsl.
function tree($array, $level = 0)
{
   foreach($array AS $id => $value)
   {
      if (is_array($value)) tree ($value, $level++);
      echo $id." // ".$value."<br />";
   }
}
tree($Ton_Tableau);

Sinon, ma class dont j'ai donné l'adresse permet de les lister 1 à 1. La c'est pas le cas
sans code supplémentaire. La class en elle même n'oblige en rien utiliser les objets...
Mais permet (en plus de les lire) de lire les tableaux à X dimension(s)... soit même
si t'as un tableau à 2²100 ;)

Pour ta question:
J'ai écrit un $key5[$i] par le biais d'un for mais je n'obtiens que le nom de la première colonne à savoir id que j'avais alimenté de cette façon :
$table['lvl1'][][$v] = array ("id" => $v2)
et ca ne m'écrit que des id, id, id (l'index en quelque sorte) alors que je voudrais la valeur associée c'est à dire $v2.
tu assignes un tableau à l'élément $V dont la clef est ID et la valeur: $V2. J'avoue que je comprends
pas le problème.
echo $table['lvl1'][][$v]["id"];
doit te retourner sa valeur et non sa clef.

J'essaie de voir ca demain, la je dois cut, dsl.

Bon j'y go @+ ;)

Eléphant du PHP | 363 Messages

01 oct. 2009, 00:40

Re re c'est de nouveau moi mais je vais filer au lit. Merci !

Bah prenons l'exemple d'un caddie électronique qui se trouverait en array 4.
Comment atteindre la qté et le prix dans la donne suivante :

-> indice du tableau, id article, qté article, poids, prix unitaire

sachant que j'ai alimenté ce dernier comme suit :
$table['lvl1'][][$v] = array ("indice" => "", art => $v2, qte => $qte, poids => $poids, prixu => $prixu);
J'me complique p'tet la vie, j'ai des circonstances atténuantes (chui une fille :lol:)
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Eléphant du PHP | 369 Messages

01 oct. 2009, 15:21

Salut,
Re re c'est de nouveau moi mais je vais filer au lit. Merci !
Bah prenons l'exemple d'un caddie électronique qui se trouverait en array 4.
Comment atteindre la qté et le prix dans la donne suivante :
-> indice du tableau, id article, qté article, poids, prix unitaire
sachant que j'ai alimenté ce dernier comme suit :
$table['lvl1'][][$v] = array ("indice" => "", art => $v2, qte => $qte, poids => $poids, prixu => $prixu);
J'me complique p'tet la vie, j'ai des circonstances atténuantes (chui une fille :lol:)
Je vais tenter de simplifier (hum... étant un mec ca va *pas* être facile mais...)

Ton exemple: Donnera

Code : Tout sélectionner

$table["lvl1"][INDICE_NUMERIQUE_INCREMENTE][$v]["indice"] => ""; $table["lvl1"][INDICE_NUMERIQUE_INCREMENTE][$v]["art"] => $V2; $table["lvl1"][INDICE_NUMERIQUE_INCREMENTE][$v]["qte"] => $qte; $table["lvl1"][INDICE_NUMERIQUE_INCREMENTE][$v]["poids"] => $poids; $table["lvl1"][INDICE_NUMERIQUE_INCREMENTE][$v]["prixu"] => $prixu;
Les éléments que tu veux récupérer se feront comme ci-après:

Code : Tout sélectionner

$indice = $table["lvl1"][INDICE_NUMERIQUE_INCREMENTE][$v]["indice"]; $art = $table["lvl1"][INDICE_NUMERIQUE_INCREMENTE][$v]["art"]; $qte = $table["lvl1"][INDICE_NUMERIQUE_INCREMENTE][$v]["qte"]; $poids = $table["lvl1"][INDICE_NUMERIQUE_INCREMENTE][$v]["poids"]; $prixu = $table["lvl1"][INDICE_NUMERIQUE_INCREMENTE][$v]["prixu"];
Le problème est ton index (indice) inconnu contenu entre crochet. Le [] dit à PHP d'incrémnter
automatiquement l'indice. Si tu veux le connaître il te faut passer par des boucles encapsulées.
Boucles dont zeus et @rthur ont parlés: foreach($tableau AS $key => $value)
Ou $key représente l'indice du tableau scanné et $valeur la valeur résultante qui peut (ou pas)
être un tableau. D'autre part il incrémente à *tous* les coups quand il rencontre cette forme ci: []
donc ton code (exemple) est invalide tel que je comprends l'exemple.

La logique serait:

Code : Tout sélectionner

$iIndex++; $indice = $table["lvl1"][$iIndex][$v]["indice"]; $art = $table["lvl1"][$iIndex][$v]["art"]; $qte = $table["lvl1"][$iIndex][$v]["qte"]; $poids = $table["lvl1"][$iIndex][$v]["poids"]; $prixu = $table["lvl1"][$iIndex][$v]["prixu"];
Tu peux aussi récupérer la référence d'un élément de cette façon: $référence = & $art = $table["lvl1"];
et le modifier. Les références sont géniales autant les utiliser.

Donc, passons à la réponse : Puisque tu connais le premier indice du tableau il te faut faire ainsi:
$item = Array();

function getItem($arrayRef)
{
   foreach($table["lvl1"] => $value_1)
   {
      // $value_1 = L'index inconnu
      //
      foreach($value AS $key => $value_2)
      {
         // $value_2 = $V, Autrement dit le level de tes items, donc
         //
         $arrayRef =  $value_2
         return true;
      }
   }
}

echo $item["indice"];
echo $item["art"];
echo $item["qte"];
echo $item["poids"];
echo $item["priu"];
Si j'ai pas oublié 1 indice (level) ca doit rouller. Mais la procédure est très très lente et le
code pas très "zoli". Le mieux serait effectivement (pardon je me répète) d'utiliser une class
de tree... telle que celle proposée plus haut mais... bon, j'insiste pas ;-)

J'espère t'avoir mis sur la piste, si tu veux plus d'infos... @+ ;-)

EDIT: Il est possible, aussi, d'interroger les tableaux de cette manière et c'est, je pense,
ce que tu cherches à faire. Un p'tit exemple pour la route:
$array["root"]["articles]["nom"] = "Le_nom";
$array["root"]["articles]["poids"] = "515";
$array["root"]["articles]["prix"] = "999€99";
$array["root"]["articles]["id"] = "65465487";

// Et la tu récupères ce que tu veux en indiquant le path avec des / ou autre
//
$string = getValue($array, "root/articles/nom");
$string = getValue($array, "root/articles/prix");
C'est juste un exemple. La procédure (je fais vite en essayant d'être compréhensible)
Il faut passer en argument le path, créer un tableau à partir de la chaine dont le séparateur
peut (comme l'éxemple) être le / et effectuer une récursivité tant que la valeur est un tableau ET
(&&) et tant que le path est en concordence avec le tableau d'origine.

Un peu long à développer donc hors cadre fofo mais sait-on jamais ;)

Je te laisse en espérant ne pas t'avoir embrouillé ;)

@+ ;)

Eléphant du PHP | 363 Messages

02 oct. 2009, 01:47

Merci une nouvelle fois pour ton aide, ton soutien, ton apport.

Je suis heureuse et vais me coucher moins bête ce soir hi hi :)

J'ai progressé, on touche au but, mais j'ai toujours une donnée farfelue, cf stp l'exemple ci-dessous. Le print_r($mon_tableau); renvoie ceci :
Array
(
    [root] => Array
        (
            [1] => Array
                (
                    [2] => Array
                        (
                            [col1] => 11
                        )

                )

        )

)
Grâce à vos codes, j'ai fait ceci :
foreach($mon_tableau as $key => $value){
  foreach($value as $key1 => $value1){
     foreach($value1 as $key2 => $value2){
	foreach($value2 as $key3 => $value3){
           $temp = mon_tableau["root"][$key1][$key2][$key3]["col1"];
             echo $temp;//me renvoie 1 au lieu de 11 si je ne m'abuse :S
             ...
Le tableau a été alimenté de la sorte :
   $iIndex++;
   $mon_tableau['root'][$iIndex][$valeur] = array (
    "col1" => $valeur2);
Bisous :love7:

Ps1 : le getValue ne fonctionne malheureusement pas mais ca doit être à cause de mon cerveau de fille
Ps2 : je taquine quand je parle du clan garçons/filles. Je suis pas féministe bande de machos ! :lol:
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Eléphant du PHP | 363 Messages

02 oct. 2009, 02:06

CA Y EST !!!!!

J'ai compris mon erreur, j'étais perdue dans mon arborescence avec tous ces tableaux et je descendais un cran trop bas.

Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci
Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci Merci

Je craque mais les 1000 y sont :D
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Eléphant du PHP | 369 Messages

02 oct. 2009, 08:52

Merci une nouvelle fois pour ton aide, ton soutien, ton apport.
Je suis heureuse et vais me coucher moins bête ce soir hi hi :)
Bien... Bonne nuit alors, oups, bonjour ;)
J'ai progressé, on touche au but, mais j'ai toujours une donnée farfelue, cf stp l'exemple ci-dessous. Le print_r($mon_tableau); renvoie ceci :
[...]
Grâce à vos codes, j'ai fait ceci :
foreach($mon_tableau as $key => $value){
  foreach($value as $key1 => $value1){
     foreach($value1 as $key2 => $value2){
	foreach($value2 as $key3 => $value3){
           $temp = mon_tableau["root"][$key1][$key2][$key3]["col1"];
             echo $temp;//me renvoie 1 au lieu de 11 si je ne m'abuse :S
             ...
[...]
[*]Bisous :love7:

Ps1 : [**]le getValue ne fonctionne malheureusement pas mais ca doit être à cause de mon cerveau de fille
Ps2 : je taquine quand je parle du clan [***]garçons/filles. Je suis pas féministe bande de machos ! :lol:
Attention: Cette méthode est valable qu'à un nombre *toujours" égaux de niveaux.
Si le nombre augmente tes données seront invalides...

[*] Dire qu'en général je demande 70€/Heure en prestation intellectuelles/techniques... (joke)

[**] Rah... Malin ca ! Mon esprit *mec* a encore frappé ! La fonction getValue était un exemple.
Celle-ci n'existe pas. Je parlais au condionnel. Ce type de requête est possible à condition, biensur,
de la développer. Assez simple à faire mais assez longue.

[***]Matcho oui ! Mais on le vaut bien... lol ...merde, je viens de confirmer que je le suis eh eh eh ;) :oops:

Bon je dois y aller, bon code et si besoin de plus d'infos pour ce sujet ou un autre hésite pas, @+ ;)