到目前为止,如果我必须循环遍历多维数组,我会为每个维度使用foreach循环。
例如二维
foreach($array as $key=>$value)
{
foreach($value as $k2=>$v2)
{
echo
}
}
当我不知道阵列的深度时,我该怎么办?即深度是可变的。
我唯一能想到的是编写一堆循环并在下一个值不是数组时打破循环。这看起来有点傻。
有更好的方法吗?
答案 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);