2013-08-25 102 views
2

我试图写一个递归计数数组元素的函数。Php递归数组计数

但结果是错误的。

这是什么问题?

$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); 
+0

错误还是零?运行'var_dump($ schema)'并告诉我们输出。 –

+0

@ConnorPeet它返回14,这是错误的结果 –

+0

啊,这是完全不同的。为什么你有'count_r($ k,count($ k));'?不应该需要第二个参数。 –

回答

1

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

但是,如果你真的想编写你自己的count()方法,这可以写成一个递归函数。

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

这是测试,工作正常。

+0

这是完美的..我不明白1的逻辑可以解释吗? –

+0

基本上,当您将该数组的count_r添加到当前级别时,您不需要在第二个参数中计入计数 - 您基本上会将其添加两次。然而,您需要“1”来计算阵列本身。如果您只想计算元素而不是数组,则只需将“1”设置为“0”即可。 –

1

你的函数可以是简单的

function count_r($array, $i = 0){ 
    foreach($array as $k){ 
     $i++; 
     if(is_array($k)){ 
      $i += count_r($k); 
     } 
    } 
    return $i; 
} 
+1

这是最小的代码..比我们的更好。 –

1

我已经改变了你的代码。请检查一下。它工作正常。

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

+0

它返回错误,未定义的变量:我 –

+0

当我把$ i = 0它也可以。 –

20

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

您可以使用它像这样:

count($schema, COUNT_RECURSIVE); 

此功能还可以检测递归来避免无限循环,因此比在其他的答案的解决方案更安全。

+1

这应该是正确的解决方案,因为@Christian P说,PHP有一个内置的方法来实现这一点。它只是使用“计数”功能。 count($ multi_level_array,COUNT_RECURSIVE) –