有没有办法在不了解深度的情况下循环遍历多维数组?

时间:2012-06-07 09:19:15

标签: php arrays nested-loops

到目前为止,如果我必须循环遍历多维数组,我会为每个维度使用foreach循环。

例如二维

foreach($array as $key=>$value)
{
    foreach($value as $k2=>$v2)
    {
         echo
    }
}

当我不知道阵列的深度时,我该怎么办?即深度是可变的。

我唯一能想到的是编写一堆循环并在下一个值不是数组时打破循环。这看起来有点傻。

有更好的方法吗?

5 个答案:

答案 0 :(得分:18)

是的,您可以使用recursion。这是一个输出数组中所有元素的示例:

function printAll($a) {
  if (!is_array($a)) {
    echo $a, ' ';
    return;
  }

  foreach($a as $v) {
    printAll($v);
  }
}

$array = array('hello',
               array('world',
                     '!',
                     array('whats'),
                     'up'),
               array('?'));
printAll($array);

在递归时你应该总是记住的是你需要一个基本案例,你不会深入了解。

我想在继续执行此功能之前检查基本情况。这是一个常见的习语,但并非绝对必要。如果你应该输出或做一个递归调用,你也可以检查foreach循环,但我经常发现代码更难以维护。

当前输入与基本情况之间的“距离”称为变体,是一个整数。在每次递归调用中,变量应严格减少。上一个示例中的变体是the depth of $a。如果您没有考虑变体,则可能会导致无限递归,最终由于stack overflow而导致脚本死亡。在递归函数之前,准确记录变量在注释中的含义并不罕见。

答案 1 :(得分:1)

您可以使用递归来解决此问题:

这是一个例子

$array = array(1 => array(1 => "a", 2 => array(1 => "b", 2 => "c", 3 => array(1 => "final value"))));

//print_r($array);

printAllValues($array);

function printAllValues($arr) {
    if(!is_array($arr)) {
        echo '<br />' . $arr;
        return;
    }
    foreach($arr as $k => $v) {
        printAllValues($v);
    }
}

它将使用递归来遍历数组

它会打印出像

a
b
c
final value

答案 2 :(得分:0)

array_walk_recursive内的简单函数,用于显示嵌套级别以及键和值:

array_walk_recursive($array, function($v, $k) {
                                 static $l = 0;
                                 echo "Level " . $l++ . ": $k => $v\n";
                             });

另一个显示use并提供结果的参考:

array_walk_recursive($array, function($v) use(&$result) {
                                 $result[] = $v;
                             });

答案 3 :(得分:0)

您可以在不知道其深度的情况下遍历多维数组执行以下功能

// recursive function loop through the dimensional array
function loop($array){

    //loop each row of array
    foreach($array as $key => $value)
    {
         //if the value is array, it will do the recursive
         if(is_array($value) ) $array[$key] =  loop($array[$key]);

         if(!is_array($value)) 
         {
            // you can do your algorithm here
            // example: 
             $array[$key] = (string) $value; // cast value to string data type

         }
    }

    return $array;
}

使用上面的函数,它将遍历每个多维数组,下面是可以传递给循环函数的示例数组:

 //array sample to pass to loop() function
 $data = [
  'invoice' => [
      'bill_information' => [
          'price' => 200.00,
          'quantity' => 5
      ],
      'price_per_quantity' => 50.00
  ],
  'user_id' => 20
];

// then you can pass it like this :
$result = loop($data);
var_dump($result);

//it will convert all the value to string for this example purpose

答案 4 :(得分:0)

基于前面的递归示例,以下函数可保留值所位于的键路径的数组,以防您需要知道如何到达此键:

function recurse($a,$keys=array()) 
    {
        if (!is_array($a)) 
            {
                echo implode("-", $keys)." => $a <br>";
                return;
            }
        foreach($a as $k=>$v) 
            {
                $newkeys = array_merge($keys,array($k));
                recurse($v,$newkeys);
            }
    }


recurse($array);