2010-09-10 43 views
33

Tengo una matriz anidada en la que quiero mostrar un subconjunto de resultados. Por ejemplo, en la matriz a continuación quiero recorrer todos los valores en una matriz anidada [1].PHP foreach con Nested Array?

 
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 
     ) 
    ) 
) 

yo estaba tratando de utilizar la función foreach pero me parece que no puede conseguir que esto funcione. Esta fue mi sintaxis original (aunque me doy cuenta de que está mal).

 
$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; 
} 

yo estaba tratando de evitar una variable comparar si la clave es la misma que la clave Quiero buscar, es decir

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

¿Alguna idea?

+0

Su sintaxis inicial parece correcta, pero '$ value' puede ser una matriz en sí misma en el' foreach'. En ese caso, no puedes simplemente repetirlo, pero también debes repetirlo. – Fanis

Respuesta

51

Si conoce el número de niveles en las matrices anidadas, simplemente puede hacer bucles anidados. Como lo siguiente:

// 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 no conoce la profundidad de la matriz que necesita para utilizar recursividad. Consulte el siguiente ejemplo:

// 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"; 
      } 
     } 
    } 
} 

El código de abajo con pantalla única matriz anidada con valores para su caso específico (sólo 3er nivel)

$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"; 
     } 
    } 
} 
+0

Creo que es posible que haya omitido mi punto de vista, solo quiero mostrar una matriz sub/anidada específica, no todas. – noangel

+0

@noangel disculpa por malentendido, mira la publicación revisada (la última parte) después de la regla horizontal. Esto debería aclarar las cosas. – Alex

+0

Probé la implementación de salida de matriz recursiva y, aunque funciona para el primer nivel, mi última matriz anidada simplemente se imprimió en una línea – myol

2

Ambas sintaxis son correctas. Pero el resultado sería Array. Es posible que desee hacer algo como esto:

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

Esto imprimirá la cadena (valor $ [0]) "dos" y los números enteros 4, 5 y 6 de la matriz (valor $ [1]) .

+0

Solo obtengo el error: Advertencia: argumento no válido proporcionado para foreach() – noangel

1
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; 
    } 
} 

perfecto funcionó para mí ... . intente esto

0

Qué le parece esta información:

[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 
        ) 
       ) 
      ) 
     ) 
    ) 

¿Puede obtener todas las rutas? Los datos se ven como un árbol binario. Necesita alguna ayuda