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递归数组计数的主要内容,如果未能解决你的问题,请参考以下文章

php如何判断数组是一维还是多维

php无限极分类递归写入多维数组的方法

php递归函数返回数组

PHP - 递归数组到对象?

PHP递归函数将多维数组转换为xml

在 PHP 中递归创建多维数组