嵌套到无限深度的多维数组

时间:2010-11-30 10:01:03

标签: php

我有一个嵌套到未知/无限深度的多维数组。 我希望能够遍历每个元素。 我不想使用foreach(){foreach(){foreach(){}}}因为我不知道深度。

我最终会寻找所有名为“xyz”的嵌套数组。有没有人有任何建议?

6 个答案:

答案 0 :(得分:10)

  

我最终会寻找所有名为“xyz”的嵌套数组。有没有人有任何建议?

不确定。在使用一些迭代器的建议的基础上,你可以这样做:

$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($array),
    RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $key => $item) {
    if (is_array($item) && $key === 'xyz') {
        echo "Found xyz: ";
        var_dump($item);
    }
}

其他答案之间的重要区别在于,在迭代时使用RecursiveIteratorIterator::SELF_FIRST标志来使非叶(即父)项(即数组)可见。

你也可以在数组迭代器周围使用ParentIterator,而不是在循环中检查数组,以使后者更整洁。

答案 1 :(得分:3)

递归。

编写一个遍历一个数组的函数;对于也是数组的每个元素,它自己调用;否则,当它找到目标字符串时,它会返回。

答案 2 :(得分:3)

未知和无限之间存在巨大的差异。但是,您可以使用SPL Iterators而不是使用多个嵌套的foreach循环。

示例:

$array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
foreach($array_obj as $key => $value) {
   echo $value;
}

答案 3 :(得分:1)

查看RecursiveIteratorIterator界面。

$interface = new RecursiveIteratorIterator( new RecursiveArrayIterator($your_array) );
foreach($interface as $k=>$v) { /* your function*/  }

答案 4 :(得分:1)

使用上面的评论,我找到了答案:

function findXyz($array){
    foreach($array as $foo=>$bar){
      if (is_array($bar)){
         if ($bar["xyz"]){
             echo "<br />The array of xyz has now been found";
             print_r($bar['xyz']);
         }else{
            findXyz($bar);   
         } 
      }
    } 
}
findXyz($myarray);

这将循环遍历所有嵌套数组,并根据我的原始请求查找具有xyz子数组的任何元素。 array_walk_array和RecursiveIteratorIterator无法实现此目的。

答案 5 :(得分:0)

您是否考虑过使用array_walk_recursive

在执行搜索之前,另一个(较慢的)方法是flatten the array,即:

$myarray = array('a','b',array(array(array('x'),'y','z')),array(array('p')));

function array_flatten($array,$return)
{
    for($x = 0; $x <= count($array); $x++)
    {
        if(is_array($array[$x]))
        {
            $return = array_flatten($array[$x],$return);
        }
        else
        {
            if($array[$x])
            {
                $return[] = $array[$x];
            }
        }
    }
    return $return;
}

$res = array_flatten($myarray,array());

或者,对于递归搜索,请参阅here以获取示例:

function arrayRecursiveSearch($needle, $haystack, $path=""){
  if(!is_array($haystack)){
    die("second argument is not array");
  }

  global $matches;

  foreach($haystack as $key=>$value)
  {
    if(preg_match("/$needle/i", $key)){
      $matches[] = array($path . "$key/", "KEY: $key");
    }

    if(is_array($value)){
      $path .= "$key/";
      arrayRecursiveSearch($needle, $value, $path);
      unset($path);
    }else{
      if(preg_match("/$needle/i", $value)){
        $matches[] = array($path . "$key/", "VALUE: $value");
      }
    }
  }

  return $matches;
}

$arr = array("Asia"=>array('rambutan','duku'),
              "Australia"=>array('pear','kiwi'),
              "Arab"=>array('kurma'));

print_r(arrayRecursiveSearch("ra",$arr));