Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有没有一种方法可以在不知道的情况下循环多维数组';深度是多少?_Php_Arrays_Nested Loops - Fatal编程技术网

Php 有没有一种方法可以在不知道的情况下循环多维数组';深度是多少?

Php 有没有一种方法可以在不知道的情况下循环多维数组';深度是多少?,php,arrays,nested-loops,Php,Arrays,Nested Loops,到目前为止,如果我必须循环一个多维数组,我会对每个维度使用foreach循环 e、 二维g foreach($array as $key=>$value) { foreach($value as $k2=>$v2) { echo } } 当我不知道数组的深度时该怎么办?深度是可变的 我唯一能想到的就是编写一整堆循环的代码,如果下一个值不是数组,就中断循环。这似乎有点愚蠢 有更好的方法吗?您可以使用递归解决此问题: 这里有一个例子 $arra

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

e、 二维g

foreach($array as $key=>$value)
{
    foreach($value as $k2=>$v2)
    {
         echo
    }
}
当我不知道数组的深度时该怎么办?深度是可变的

我唯一能想到的就是编写一整堆循环的代码,如果下一个值不是数组,就中断循环。这似乎有点愚蠢


有更好的方法吗?

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

这里有一个例子

$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);
    }
}
是的,你可以用。下面是一个示例,您可以在其中输出数组中的所有元素:

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
循环,但我经常发现这样维护代码比较困难


当前输入和基本大小写之间的“距离”称为变量,是一个整数。在每次递归调用中,变量应该严格递减。上例中的变量是
深度$a
。如果你不考虑这个变量,你就有可能以无限的递归结束,最终脚本会因为一个错误而死亡。在递归函数之前,准确记录注释中的变量并不少见。

数组中的简单函数\u walk\u recursive显示嵌套级别以及键和值:

array_walk_recursive($array, function($v, $k) {
                                 static $l = 0;
                                 echo "Level " . $l++ . ": $k => $v\n";
                             });
另一个显示<代码>使用并引用以获得结果:

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

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

// 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

基于前面的递归示例,下面是一个函数,它保存一个值所在的键路径数组,以防您需要知道如何获得该值:

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);
函数递归($a,$keys=array()) { 如果(!是_数组($a)) { 回波内爆(“-”,$keys)。“=>$a
”; 返回; } foreach($a为$k=>$v) { $newkeys=array_merge($keys,array($k)); 递归($v,$newkey); } } 递归($array);
否。使用内置数组\u walk\u recursive()。PHP在递归方面很差劲。array\u walk\u recursive只处理叶节点并跳过子数组。在给出的示例中,它将无法使用。谢谢你的回答:)array\u walk\u recursive只处理叶节点和跳过子数组。在给出的示例中,它将无法使用。
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);