8

我正在尝试编写一个递归计算数组元素的函数。

但结果是错误的。

可能是什么问题?

$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);
4

6 回答 6

37

这是 Google 上的第二个结果,所以我将其添加为参考。PHP 中已经有一个可以使用的内置函数:count()

你可以像这样使用它:

count($schema, COUNT_RECURSIVE);

此函数还可以检测递归以避免无限循环,因此它比其他答案中的解决方案更安全。

于 2014-02-06T14:06:22.790 回答
12

PHP 有一个用于此目的的内置方法,称为count(). 如果不带任何附加参数传递,count()则返回第一级数组键的数量。但是,如果您将第二个参数传递给 count 方法count( $schema, true ),则结果将是多维数组中键的总数。标记为正确的响应仅迭代第一级和第二级数组,如果该数组中有第三个孩子,它将不会返回正确答案。

但是,如果您真的想编写自己的 count() 方法,则可以将其编写为递归函数。

于 2015-03-16T16:09:02.143 回答
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);

这是经过测试并且可以正常工作的。

于 2013-08-25T14:33:51.517 回答
1

如果你想计算特定的键/值,你可以使用内置的 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
*/
于 2018-11-19T09:26:29.153 回答
0

你的功能可能很简单

function count_r($array, $i = 0){
    foreach($array as $k){
        $i++;
        if(is_array($k)){ 
            $i += count_r($k); 
        }
    }
    return $i;
}
于 2013-08-25T14:36:43.780 回答
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){
 foreach($array as $k){
    if(is_array($k)){
            $i += count_r($k); 
        }
    else{
        $i++; 
    }
}
return $i;

} 回声 count_r($schema);

于 2013-08-25T14:39:33.047 回答