php递归数组计数
Posted
技术标签:
【中文标题】php递归数组计数【英文标题】:Php recursive array counting 【发布时间】:2013-08-28 02:33:14 【问题描述】:我正在尝试编写一个递归计算数组元素的函数。
但结果是假的。
可能有什么问题?
$schema = array(
'div' => array(
'class' => 'lines',
'div' => array(
'span' => array(
'key' => 'Product Name'
),
'val' => 'Soap'
),
'layer' => array(
'span' => array(
'key' => 'Product Name'
),
'val' => 'Ball'
)
)
);
function count_r($array, $i = 0)
foreach($array as $k)
if(is_array($k)) $i += count_r($k, count($k));
else $i++;
return $i;
echo count_r($schema);
【问题讨论】:
假还是零?运行var_dump($schema)
并告诉我们输出。
@ConnorPeet 返回 14,这是错误结果
啊,那是完全不同的。为什么你有count_r($k, count($k));
?不需要第二个参数。
但是没有这个参数我怎么能递归计算?
【参考方案1】:
转自以下答案的评论:
基本上,当您将该数组的 count_r
添加到当前级别时,您不需要考虑第二个参数中的计数 - 您基本上会添加两次。但是,您需要其中的“1”来计算数组本身。如果您只想计算元素而不是数组,则只需将“1”设为“0”即可。
$schema = array(
'div' => array(
'class' => 'lines',
'div' => array(
'span' => array(
'key' => 'Product Name'
),
'val' => 'Soap'
),
'layer' => array(
'span' => array(
'key' => 'Product Name'
),
'val' => 'Ball'
)
)
);
function count_r($array, $i = 0)
foreach($array as $k)
if(is_array($k)) $i += count_r($k, 1);
else $i++;
return $i;
echo count_r($schema);
这是经过测试并且可以正常工作的。
【讨论】:
【参考方案2】:你的功能可以很简单
function count_r($array, $i = 0)
foreach($array as $k)
$i++;
if(is_array($k))
$i += count_r($k);
return $i;
【讨论】:
【参考方案3】:我已经修改了你的代码。请检查一下。它工作正常。
$schema = array(
'div' => array(
'class' => 'lines',
'div' => array(
'span' => array(
'key' => 'Product Name'
),
'val' => 'Soap'
),
'layer' => array(
'span' => array(
'key' => 'Product Name'
),
'val' => 'Ball'
)
)
);
function count_r($array)
foreach($array as $k)
if(is_array($k))
$i += count_r($k);
else
$i++;
return $i;
echo count_r($schema);
【讨论】:
【参考方案4】:这是 Google 上的第二个结果,所以我将其添加为参考。 php 中已经有一个可以使用的内置函数:count()。
你可以这样使用它:
count($schema, COUNT_RECURSIVE);
此函数还可以检测递归以避免无限循环,因此它比其他答案中的解决方案更安全。
【讨论】:
这应该是正确的解决方案,因为正如@Christian P 所说,PHP 有一个内置的方法来完成这个。它只是使用“计数”功能。 count($multi_level_array, COUNT_RECURSIVE)【参考方案5】:PHP 有一个用于此目的的内置方法,称为count()
。如果不带任何附加参数传递,count()
返回第一级数组键的数量。但是,如果将第二个参数传递给计数方法count( $schema, true )
,则结果将是多维数组中的键总数。标记为正确的响应仅迭代第一级和第二级数组,如果该数组中有第三个孩子,它将不会返回正确的答案。
如果您真的想编写自己的 count() 方法,可以将其编写为递归函数。
【讨论】:
【参考方案6】:如果你想计算特定的键/值,你可以使用内置的 array_walk_recursive 和闭包函数。
$schema = array(
'div' => array(
'class' => 'lines',
'div' => array(
'span' => array(
'key' => 'Product Name'
),
'val' => 'Soap'
),
'layer' => array(
'span' => array(
'key' => 'Product Name'
),
'val' => 'Ball'
)
)
);
$elements = 0;
array_walk_recursive($schema, function($value, $key) use (&$elements)
if (strstr($value, 'Product')) $elements++;
);
print $elements; // 2
/*
Values
lines
Product Name
Soap
Product Name
Ball
Keys
class
key
val
key
val
*/
【讨论】:
以上是关于php递归数组计数的主要内容,如果未能解决你的问题,请参考以下文章