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

Mat*_*kos 10 php arrays nested-loops

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

例如,对于两个维度

foreach($array as $key=>$value)
{
    foreach($value as $k2=>$v2)
    {
         echo
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

有没有更好的办法?

Emi*_*röm 20

是的,你可以使用递归.这是一个输出数组中所有元素的示例:

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);
Run Code Online (Sandbox Code Playgroud)

在进行递归时你应该永远记住的是,你需要一个你不会更深入的基础案例.

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

当前输入和基本情况之间的"距离"称为变量,是一个整数.在每次递归调用中,变量应严格减少.上一个例子中的变体是the depth of $a.如果你没有考虑变量,你可能会面临无限递归的风险,最终由于堆栈溢出而导致脚本死亡.在递归函数之前准确记录变量在注释中的含义并不罕见.


bat*_*hir 5

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

// 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;
}
Run Code Online (Sandbox Code Playgroud)

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

 //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
Run Code Online (Sandbox Code Playgroud)