PHP中复杂多维数组中的维数计数
我不确定这个问题是否得到了回答,但我想知道是否有一种简单的方法可以在不递归调用函数的情况下计算数组的维数 下面是我的数组的一个示例PHP中复杂多维数组中的维数计数,php,multidimensional-array,Php,Multidimensional Array,我不确定这个问题是否得到了回答,但我想知道是否有一种简单的方法可以在不递归调用函数的情况下计算数组的维数 下面是我的数组的一个示例 $a[0][1][2][3]=4; $a[0][11][22]=33; $a[0][111]=222; $a[0][1][2][3][4][5][6][7]=888; $a[0][1][2][3][4][5][6][7][8]=999; 但我的实际数组不一定是数字 我想要输出的是上面示例中的以下值 3,2,1,7和8 有没有人能在不需要递归函数调用或大量CPU使用
$a[0][1][2][3]=4;
$a[0][11][22]=33;
$a[0][111]=222;
$a[0][1][2][3][4][5][6][7]=888;
$a[0][1][2][3][4][5][6][7][8]=999;
但我的实际数组不一定是数字
我想要输出的是上面示例中的以下值
3,2,1,7和8
有没有人能在不需要递归函数调用或大量CPU使用的情况下为我指出正确的方向
更新: 我问这个问题的原因是因为我确实有一个大问题要解决。我在internet上借用了一个函数,在使用print_r()函数后,该函数实际将我的邻接列表处理为一个数组,如下所示:
Array
(
[Pint] => Array
(
[Beer] => Array
(
[Parent] => Pint
)
[Parent] =>
)
[Into] => Array
(
[Running] => Array
(
[Group] => Array
(
[Girl] => Array
(
[Parent] => Group
)
[Guy] => Array
(
[Parent] => Group
)
[Parent] => Running
)
[Parent] => Into
)
[Parent] =>
)
)
我想做的是使用数组中的数据来形成一个句子,而不使用固定的数字或名称,因为数组名称和值(键父级除外)会发生变化
在这个数组中,我想用这些单词组成以下句子,并在数组中穿行:
第1句。一品脱啤酒(稍后我将添加“A”和“of”。品脱啤酒和啤酒来自数组。)
第二句。一群人中的女孩和男孩遇到了什么(“and”,“in a”和“something”是我将在后面的句子中添加的词)
如果有一个像foreach这样的函数从最后一个维度开始工作到第一个维度,这可能会有所帮助。这些句子的共同点是,最后一个维度先处理,第一个维度最后处理
有人对答案有想法吗
p.S.I更新了其他代码,使数组如下所示:
Array
(
[Girl] => Array
(
[Group] => Array
(
[Running] => Array
(
[Into] =>
)
)
)
[Guy] => Array
(
[Group] => Array
(
[Running] => Array
(
[Into] =>
)
)
)
[Beer] => Array
(
[Pint] =>
)
)
好吧,这里有一个递归的解决方案。它给出了最深维度的计数:
function count_array_dimensions($a, $count) {
$max = $count;
foreach($a as $e) {
if(is_array($e)) {
$current = count_array_dimensions($e, $count+1);
if($current > $max) {
$max = $current;
}
}
}
return $max;
}
//Usage:
$a[0][1][2][3][4][5][6][7][8]=999;
//Initialize with 0 instead of 1 for your counting scheme
echo count_array_dimensions($a, 1);
在所有这些数组的维度上,你已经偏离了1。您的输出应该是4、3、2、8和9。不幸的是,这是您在这里的最佳选择。首先$a[0]是一维的,所以$a[0][111]将是二维的,而不是您对1的猜测。您是对的。。。。我忘记更新了。我在foreach循环上想得太多了。@MikeSt请看我更新的答案。。看看你的数据,递归的深度不应该是一个问题。OP特别提到“不需要递归函数调用”,我理解这一点。具体来说,他或她说“不需要递归函数调用或大量CPU使用”,这让我相信他们错误地认为这样的操作会占用大量CPU。它可能适用于特别大的阵列。不使用递归的唯一方法是使用堆栈和队列,这将至少具有同等的CPU密集度。因此,我的答案是,他或她的“最佳选择”是使用一行数组\u walk\u recursive()。array\u walk\u recursive()不会迭代空数组元素,因此它可能也不起作用。它不是一个线性函数,它们仍然需要使用回调函数实际计算维度。我很确定我的解决方案在没有递归、没有堆栈或队列的情况下是有效的。它在以下情况下不起作用:(1)数组有非数值索引。(2) 数组没有零索引。(3) 该数组的索引为零,子数组数少于另一个索引。