【问题标题】:Php recursive array countingphp递归数组计数
【发布时间】: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));?不需要第二个参数。
  • 但是没有这个参数我怎么能递归计算?

标签: php arrays recursion multidimensional-array arraylist


【解决方案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
          */
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-04
            • 2012-04-19
            相关资源
            最近更新 更多