Как распечатать все элементы многомерного массива с пользовательской разметкой? - PullRequest
2 голосов
/ 26 ноября 2010

У меня есть многомерный массив, похожий на этот:

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 26 ноября 2010

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

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

затем напишите свою функцию-обработчик, регулярное выражение или любое другое задание, предназначенное для каждого элемента массива типа 'image'

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

?>
1 голос
/ 26 ноября 2010

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

При этом вы можете попробовать что-то вроде этого:

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