如何使用自定义标记打印出多维数组的所有项目?

时间:2010-11-26 06:09:37

标签: php loops recursion multidimensional-array

我有一个类似的多维数组:

(
  [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 循环,但无济于事。

NB:我已从两个不递归的源数组编译此数组,并且可以使用这些具有相关键的数组,如果这有助于解决方案。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

如果函数变得过于复杂,你需要一个处理程序来完成递归函数的工作。

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

?>