代码之家  ›  专栏  ›  技术社区  ›  stevenmc

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

php
  •  6
  • stevenmc  · 技术社区  · 15 年前

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

    我最终会寻找所有嵌套数组,称为“ xyz ". 有人有什么建议吗?

    6 回复  |  直到 15 年前
        1
  •  10
  •   salathe    15 年前

    我最终会寻找所有称为“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 flag用于在迭代时使非叶(即父)项(即数组)可见。

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

        2
  •  3
  •   tdammers    15 年前

    递归。

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

        3
  •  3
  •   Russell Dias    15 年前

    有一个 巨大的 未知和无限的区别。但是,您可以利用 SPL Iterators 而不是使用多个嵌套 foreach 循环。

    例子:

    $array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
    foreach($array_obj as $key => $value) {
       echo $value;
    }
    
        4
  •  1
  •   Fabio Mora    15 年前

    看看 RecursiveIteratorIterator 接口。

    $interface = new RecursiveIteratorIterator( new RecursiveArrayIterator($your_array) );
    foreach($interface as $k=>$v) { /* your function*/  }
    
        5
  •  1
  •   stevenmc    15 年前

    通过上面的评论,我找到了答案:

    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和recursiveiteratoritator无法实现这一点。

        6
  •  0
  •   SW4    15 年前

    你有没有想过用 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));
    
    推荐文章