2013-06-21 2 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, 
     ), 
    ), 
    ), 

и т.д ..

И вложенный цикл Еогеасп, которая проходит через массив, который может напечатать все значения массива следующим образом:

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) отображать конкретные (т.е. имя, владелец, 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» на самом деле представляют собой два отдельных массива «Retrievers» (4 ножных ретривера и 3-х ножных ретриверов). Я не уверен, что это намеренно, и если да, то как именно это правило должно работать.

Во-вторых, вы видите «большие собаки», как если бы это был ключ массива верхнего уровня, когда на самом деле это значение «Имя» одного из дочерних элементов в этом массиве. Опять же, если это намеренно, я не совсем уверен, что такое правило, если для определения того, что вы хотите отобразить и как.

Если этот ответ недостаточно хорош для вас, чтобы выяснить остальное самостоятельно, вам нужно будет предоставить больше данных образца и образец вывода, чтобы я мог точно определить, чего вы пытаетесь достичь.

+0

Спасибо, Джеймс! Я попробую сегодня. – bridgemanusa