web-dev-qa-db-fra.com

PHP foreach avec un tableau imbriqué?

J'ai un tableau imbriqué dans lequel je veux afficher un sous-ensemble de résultats. Par exemple, dans le tableau ci-dessous, je souhaite parcourir toutes les valeurs du tableau imbriqué [1].

 Array 
 (
 [0] => Array 
 (
 [0] => un 
 [1] => Array 
 (
 [0] = > 1 
 [1] => 2 
 [2] => 3 
) 
) 

 [1] => Tableau 
 (
 [0] => deux 
 [1] => Tableau 
 (
 [0] => 4 
 [1] => 5 
 [2] => 6 
) 
 ) 

 [2] => Tableau 
 (
 [0] => trois 
 [1] => Tableau 
 (
 [0] => 7 
 [1] => 8 
 [2] => 9 
) 
) 
) 

J'essayais d'utiliser la fonction foreach mais je n'arrive pas à obtenir que cela fonctionne. C'était ma syntaxe originale (même si je réalise que c'est faux). 

 $ tmpArray = array (tableau ("un", tableau (1,2,3)), tableau ("deux", tableau (4,5,6)), tableau ("trois", tableau (7, 8,9))); 

 Foreach ($ tmpArray [1] comme $ valeur) {
 echo $ valeur; 
} 

J'essayais d'éviter une comparaison de variable pour savoir si la clé est identique à la clé que je souhaite rechercher, c'est-à-dire.

 foreach ($ tmpArray as $ key => $ value) {
 if ($ key == 1) {
 echo $ valeur; 
 } 
} 

Des idées?

34
noangel

Si vous connaissez le nombre de niveaux dans les tableaux imbriqués, vous pouvez simplement faire des boucles imbriquées. Ainsi:

//  Scan through outer loop
foreach ($tmpArray as $innerArray) {
    //  Check type
    if (is_array($innerArray)){
        //  Scan through inner loop
        foreach ($innerArray as $value) {
            echo $value;
        }
    }else{
        // one, two, three
        echo $innerArray;
    }
}

si vous ne connaissez pas la profondeur du tableau, vous devez utiliser la récursivité. Voir exemple ci-dessous:

//  Multi-dementional Source Array
$tmpArray = array(
    array("one", array(1, 2, 3)),
    array("two", array(4, 5, 6)),
    array("three", array(
            7,
            8,
            array("four", 9, 10)
    ))
);

//  Output array
displayArrayRecursively($tmpArray);

/**
 * Recursive function to display members of array with indentation
 *
 * @param array $arr Array to process
 * @param string $indent indentation string
 */
function displayArrayRecursively($arr, $indent='') {
    if ($arr) {
        foreach ($arr as $value) {
            if (is_array($value)) {
                //
                displayArrayRecursively($value, $indent . '--');
            } else {
                //  Output
                echo "$indent $value \n";
            }
        }
    }
}

Le code ci-dessous avec affichage uniquement du tableau imbriqué avec des valeurs pour votre cas spécifique (3ème niveau uniquement)

$tmpArray = array(
    array("one", array(1, 2, 3)),
    array("two", array(4, 5, 6)),
    array("three", array(7, 8, 9))
);

//  Scan through outer loop
foreach ($tmpArray as $inner) {

    //  Check type
    if (is_array($inner)) {
        //  Scan through inner loop
        foreach ($inner[1] as $value) {
           echo "$value \n";
        }
    }
}
56
Alex
foreach ($tmpArray as $innerArray) {
    //  Check type
    if (is_array($innerArray)){
        //  Scan through inner loop
        foreach ($innerArray as $value) {
            echo $value;
        }
    }else{
        // one, two, three
        echo $innerArray;
    }
}

Parfait a fonctionné pour moi .... essayez ceci

3
Pratik Sawant

Les deux syntaxes sont correctes. Mais le résultat serait Array. Vous voulez probablement faire quelque chose comme ça:

foreach ($tmpArray[1] as $value) {
  echo $value[0];
  foreach($value[1] as $val){
    echo $val;
  }
}

Cela affichera la chaîne "deux" ($ value [0]) et les entiers 4, 5 et 6 du tableau ($ value [1]).

2
2ndkauboy

Que diriez-vous de ces données:

[0] => Array (
    [item] => null
    [count] => 0
    [child] => Array (
        [1] => Array (
            [item] => 1
            [count] => 6
            [child] => Array (
                [5] => Array (
                    [item] => 5
                    [count] => 3
                    [child] => Array (
                        [4] => Array (
                            [item] => 4
                            [count] => 1
                            )
                        )
                    )
                [3] => Array (
                    [item] => 3
                    [count] => 2
                    [child] => Array (
                        [4] => Array (
                            [item] => 4
                            [count] => 1
                            )
                        )
                    )
                )
            )
        [3] => Array (
            [item] => 3
            [count] => 1
            [child] => Array (
                [4] => Array (
                    [item] => 4
                    [count] => 1
                    )
                )
            )
        )
    )

Pouvez-vous obtenir tous les chemins? Les données ressemblent à un arbre binaire. Besoin d'aide

0
mario caseres