Multidimensional Arrays Nested to Unlimited Depth

后端 未结 6 1048
被撕碎了的回忆
被撕碎了的回忆 2020-12-06 07:33

I have a multidimensional array nested to an unknown/unlimited depth. I\'d like to be able to loop through every element. I don\'t want to use, foreach(){foreach(){for

6条回答
  •  情书的邮戳
    2020-12-06 08:04

    Have you thought about using array_walk_recursive for this?

    Another (slower) approach would be to flatten the array first before performing a search, ie:

    $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());
    

    Or, for a recursive search, see here for an example:

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

提交回复
热议问题