2010-09-10 119 views
33

我有一個嵌套數組,我想在其中顯示結果的子集。例如,在下面的數組中,我想遍歷嵌套數組[1]中的所有值。帶有嵌套數組的PHP foreach?

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

我想使用foreach函數,但我似乎無法得到這個工作。這是我的原始語法(儘管我意識到這是錯誤的)。

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

我試圖避免的密鑰是否相同,我想搜索的關鍵變量比較,即

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

任何想法?

+0

你的初始化語法看起來不錯,但'$ value'可以是'foreach'中的一個數組本身。在這種情況下,你不能只是迴應它,但你也需要循環。 – Fanis 2010-09-10 12:22:04

回答

51

如果您知道嵌套數組中的層數,則可以簡單地執行嵌套循環。像這樣:

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

,如果你不知道數組,你需要使用遞歸的深度。見下面的例子:

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

與只顯示嵌套數組下面的代碼與特定情況下的值(僅第3級)

$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

我想你可能錯過了我的觀點,我只想顯示一個特定的嵌套/子數組,而不是全部。 – noangel 2010-09-10 12:42:18

+0

@noangel對於誤解感到抱歉,請參閱橫向規則後的修改後(最後部分)。這應該澄清事情。 – Alex 2010-09-10 12:50:07

+0

我試過你的遞歸數組輸出實現,雖然它適用於第一級,但我的最後一個嵌套數組只是在一行上輸出 – myol 2014-10-23 09:04:05

2

兩種語法都是正確的。但結果將是Array。你可能想要做這樣的事情:

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

這將打印出字符串「兩化」($ [0]值)和整數4,5和6從陣列($值[1]) 。

+0

我只收到錯誤: 警告:爲foreach提供的無效參數() – noangel 2010-09-10 12:37:33

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

完美的工作對我來說... 。試試這個

0

這個數據如何:

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

你能得到所有的途徑嗎?數據看起來像一棵二叉樹。需要一些幫助