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