2010-11-26 3 views
2

У меня есть многомерный массив, похожий на этот:Как распечатать все элементы многомерного массива с пользовательской разметкой?

(
    [0] (
    title: 'First Group' 
    type: 'group' 
    children: (
     [0] (
     title: 'Inner Group' 
     type: 'group' 
     children: (
      [0] (
      title: 'Deep image' 
      type: 'image' 
     ) 
      [1] (
      title: 'Another deep image' 
      type: 'image' 
     ) 
     ) 
    ) 
    ) 
) 
    [1] (
    title: 'Root depth image' 
    type: 'image' 
) 
) 

Я хочу, чтобы иметь возможность работать мой путь через этот массив, и все это дети (этот массив может быть бесконечно рекурсивным), чтобы напечатать/эхо содержания в браузер.

У меня есть возможность указать определенную разметку (и даже выполнить условные обозначения для каждого элемента) для разных типов элементов.

Например. Распечатайте заголовок каждого изображения только в том случае, если оно соответствует регулярному выражению и т. Д.

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

Если существует цикл (не используется функция), это, вероятно, будет наиболее подходящим вариантом, поэтому у каждого ребенка я могу выполнить любые необходимые условия для каждого элемента. Я пробовал с , а и foreach Петли, но безрезультатно.

NB: Я скомпилировал этот массив из двух исходных массивов, которые не были рекурсивными, и могут использовать эти массивы, имеющие связанные ключи, если это помогает решению.

ответ

1

Если функция становится слишком сложным, вам нужен обработчик, чтобы сделать работу вместе с рекурсивной функции.

function walk($array, $handler) 
{ 
    foreach($array as $obj) { 
     if(is_array($obj['children'])) { 
     walk($obj['children'], $handler); //RECURSION 
     } else { 
     $handler($obj); 
     } 
    } 
} 

затем написать функцию обработчика, регулярное выражение или любую работу, его должен для каждого элемента массива типа «изображения»

function array_handler ($single_array){ 
     #Do some regexp or more complex job here. 
    print $single_array['url']."<br/>"; 
} 

и когда вы должны позвонить,

walk ($myarray, 'array_handler'); 

в основном мы определили новый метод, называемый walk, который действует как foreach, а while, но блок кода будет выполняться обработчиком для каждого элемента.

Полный код,

<?php 
$myarray = array(array (
      "title" => 'First Group', 
      "type" => 'group', 
      "children" => array (
        array ("title" => 'Inner Group', 
         "type" => "group", 
        "children" => array (
            array (
          "title" => "Deep Image", 
            "type" => 'image', 
          "url" => "image.jpg" 
           ), 
           array (
            "title" => 'Another Deep Image', 
           "type" => 'image', 
          "url" => "image2.jpg"  
           ) 
        )  
       ) 

       ) 
      ), 
       array (
       "title" => 'Root Deep Image', 
       "type" => 'image', 
         "url" => "image.jpg" 
     ) 
     ); 




function walk($array, $handler) 
{ 
    foreach($array as $obj) { 
     if(is_array($obj['children'])) { 
      walk($obj['children'], $handler); //RECURSION 
     } else { 
    $handler($obj); 
     } 
    } 

} 

function array_handler ($single_array){ 
    print $single_array['url']."<br/>"; 
} 

walk ($myarray, 'array_handler'); 

?> 
+0

и иметь метод ходьбы как общий модуль, доступный в вашем коде, и использовать его везде, как вы используете foreach/while – kalyan 2010-11-26 09:22:09

1

Решить эту проблему можно только рекурсивно, так как размер ввода не определен.

Это, как говорится, вы могли бы попробовать что-то вроде этого:

$regexp_map = array(
    'group' => 'some regexp', 
    'image' => 'some other regexp' 
); 

function walk($array) { 
    $output = ''; 
    foreach($array as $obj) { 
     if(is_array($obj['children'])) { 
      $output .= walk($value['children']); //RECURSION 
     } else { 
      $regexp = $regexp_map[$obj['type']]; 
      if(preg_match($regexp, $obj['title'])) 
      $output .= $obj['title']; 
     } 
    } 
    return $output; 
} 
+0

Спасибо за советы. Хотя регулярные выражения - это всего лишь пример того, как я хочу манипулировать данными, к сожалению, поэтому я мог видеть, что эта функция становится слишком сложной, чтобы позволить мне много разных способов манипулирования. – Rhys 2010-11-26 06:41:57