Un foreach PHP avec un tableau imbriqué?

j'ai un tableau imbriqué dans laquelle je veux afficher un sous-ensemble de résultats. Par exemple, sur le tableau ci-dessous je veux boucler toutes les valeurs dans le tableau imbriqué[1].

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

  [1] => Array
    (
      [0] => two
      [1] => Array
        (
          [0] => 4
          [1] => 5
          [2] => 6
        )
    )

  [2] => Array
    (
      [0] => three
      [1] => Array
        (
          [0] => 7
          [1] => 8
          [2] => 9
        )
    )
)

j'essayais d'utiliser la fonction foreach mais je n'arrive pas à y arriver. C'était ma syntaxe originale (même si je me rends compte que c'est faux).

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

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

je suis en essayant d'éviter une variable de comparer si la clé est la même que la clé je recherche, i.e.

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

des idées?

34
demandé sur noangel 2010-09-10 16:08:59

4 réponses

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

//  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 l'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 display only nested array avec des valeurs pour votre cas spécifique (3ème niveau seulement)

$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
répondu Alex 2010-09-10 12:48:58
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;
    }
}

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

3
répondu Pratik Sawant 2013-10-18 11:17:45

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

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

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

2
répondu 2ndkauboy 2010-09-10 12:26:09

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 toutes les voies? Les données ressemblent à un arbre binaire. Besoin somehelp

0
répondu mario caseres 2017-09-11 16:19:18