我正在尝试编写一个递归计算数组元素的函数。
但结果是假的。
这可能是什么问题?
$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);
PHP 中有一个内置函数可以使用:count()。
这就是你如何使用它:
count($schema, COUNT_RECURSIVE);
此函数还检测递归以避免无限循环,因此它比其他答案中的解决方案更安全。
PHP 有一个用于此目的的内置方法,称为
count()
。如果在没有任何附加参数的情况下传递,则 count()
返回第一层数组键的数量。但是,如果将第二个参数传递给 count 方法count( $schema, true )
,那么结果将是多维数组中键的总数。标记为正确的响应仅迭代第一级和第二级数组,如果该数组中有第三个子级,它将不会返回正确的答案。
不过,如果您确实想编写自己的 count() 方法,则可以将其编写为递归函数。
转自下面答案的评论:
基本上,当您将该数组的
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);
这已经过测试并且工作正常。
你的功能可以很简单
function count_r($array, $i = 0){
foreach($array as $k){
$i++;
if(is_array($k)){
$i += count_r($k);
}
}
return $i;
}
我已经更改了您的代码..请检查。运行良好。
$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;
} 回显 count_r($schema);
如果你想计算特定的键/值,你可以使用内置的 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
*/
count($array, COUNT_RECURSIVE)-count($array)