2013-06-21 63 views
0

我有一個只讀的多維關聯數組,我需要從中提取特定值以生成具有某些值的輸出。使用php列出多維數組中的特定鍵/值

陣列看起來像這樣:

array (
'Dogs' => 
array (
0 => 
array (
    'Name' => 'Big Dogs', 
    'ID' => '32', 
    'Brown dogs' => 
    array (
    0 => 
    array (
     'Name' => '4 legged dogs', 
     'Retrievers' => 
     array (
     0 => 
     array (
      'Name' => 'Fido', 
      'ID' => '11', 
      'Owner' => 'Billy', 
      'IsaBiter' => true, 
     ), 
    ), 
    ), 
    1 => 
    array (
     'Name' => '3 legged dogs', 
     'Retrievers' => 
     array (
     0 => 
     array (
      'Name' => 'Spot', 
      'ID' => '12', 
      'Owner' => 'Sally', 
      'IsaBiter' => false, 
     ), 
    ), 
    ), 

等。

這通過可打印陣列的所有值如下所述陣列運行的嵌套foreach循環:

echo "<ul>"; 
foreach($myArray as $arr1 => $val1) { 
    foreach($val1 as $arr2 => $val2) { 
    foreach($val2 as $val3) { 
    echo "<li>" . $val3 . "<ul>"; 
     foreach($val3 as $arr4 => $val4) { 
     foreach($val4 as $arr5 => $val5) { 
     echo "<li>" . $val5; 
     foreach($val5 as $arr6 => $val6) { 
     //echo $val6; 
       foreach($val6 as $arr7 => $val7) { 
      echo $val7 . "<br />"; //dumps the details 
        } 
        echo "</li>"; 
       } 
       }    
     } 
     echo "</ul>"; 
     echo "</li>"; 
     } 
    } 
} 

理想情況下,我希望能夠1)排除我不想顯示的值(ID,某些數組級別名稱等,目前顯示全部)和2)顯示特定的值(即Name,Owner,IsaBiter)我可以格式化結果更清晰,類似於此:

Big Dogs 
    Brown Dogs 
    Retrievers 
     Name: Fido 
     Owner: Billy 
     IsaBiter: true 

     Name: Spot 
     Owner: Sally 
     IsaBiter: false 
+0

你應該爲此使用遞歸。 –

+0

當你使用foreach($ array AS $ key => $ value){}時,你可以比較$ key和你想要顯示的內容(它只是一個字符串)。無論如何,過濾一個級別會更加複雜,您應該包含一個迭代器值(一個整數計數級別)並在正確時排除。也許,正如@WayneWhitty所說,使用遞歸會更好。 –

+0

感謝您的評論,但我爲什麼要這麼做? – bridgemanusa

回答

1

這裏是一個遞歸函數的開始接近匹配你想要的。

function displayArray($array, $level = 0) { 
    // This filter determines which levels are displayed 
    $visible = in_array($level, array(0,2,4,6)); 

    if ($visible) { 
    echo '<ul>'; 
    foreach($array as $key => $value) { 
     if (is_array($value)) { 
     echo '<li>'; 
     echo $key; 
     displayArray($value, $level + 1); 
     echo '</li>'; 
     }      
     else { 
     // This filter determines which non-array keys are displayed 
     $visible = $level == 6 and in_array($key, array('Name','Owner','IsaBiter')); 

     if ($visible) { 
      if (is_bool($value)) $value = $value ? "true" : "false"; 
      echo '<li>'; 
      echo "$key : $value"; 
      echo '</li>'; 
     } 
     } 
    } 
    echo '</ul>'; 
    } 
    else { 
    // If a level is not visible, we still try and display child arrays 

    foreach($array as $key => $value) 
     if (is_array($value)) 
     displayArray($value, $level + 1); 
    }       
} 

我已經展示瞭如何篩選出特定的水平,特定鍵,但你可能需要做的比這更多,讓你已經證明了精確的輸出。儘管「Fido」和「Spot」實際上來自兩個單獨的「檢索器」陣列(4個腿式檢索器和3個腿式檢索器),但在您的示例中,您只能顯示一次「檢索器」。我不確定這是否是故意的,如果是,那麼該規則應該如何工作。其次,您將「Big Dog」顯示爲頂層數組的鍵,而實際上它是該數組中項目的子項之一的「Name」值。再次,如果這是故意的,我不確定如果決定你想要顯示什麼以及如何顯示的規則。

如果這個答案不足以讓你自己找出其他的問題,那麼你將需要提供更多的樣本數據和樣本輸出,以便我可以準確地確定你想要達到的目標。

+0

謝謝詹姆斯!我今天會試試這個。 – bridgemanusa