【问题标题】:PHP: Number of all elements in an arrayPHP:数组中所有元素的数量
【发布时间】:2013-09-30 12:40:58
【问题描述】:

有没有办法找出所有嵌套级别的一个数组中有多少个值元素?

我想知道$_REQUEST 中有多少,以便在接近达到max_input_vars 指令规定的限制时发出警告?

我只想计算实际值,因此 如果数组元素是另一个数组,则不应计算它们(请参阅 http://pastebin.com/QAKxxqJf)

【问题讨论】:

标签: php


【解决方案1】:

使用:count($array_name, COUNT_RECURSIVE);

count 方法采用第二个参数,即模式。 intCOUNT_NORMALCOUNT_RECURSIVE

【讨论】:

  • 我认为这并不完全正确,因为递归计数也将键计入总数,请参阅:pastebin.com/QAKxxqJf
  • 从计数递归中减去计数,您将获得魔法。在高级情况下,您将需要做一些 if 和 foreach 技巧:-)
  • 这不是正确答案! max_input_vars 不计算子数组容器,而 count($a, 1) 计算(虽然 count($a, COUNT_RECURSIVE); 通常是一件好事;))
【解决方案2】:

使用array_walk_recursive 计算所有不属于arrayobject 类型的元素:

$count = 0;
array_walk_recursive($a, function($v) use(&$count) {
    if(!is_object($v)) ++$count;      //or if(is_string($v))
});

【讨论】:

  • 为什么需要if(!is_array($v) && !is_object($v))?只是简单的++$count; 我得到$count 相同的结果(用多维数组$_REQUEST 测试)
  • 所以它会忽略对象值。例如,如果您的数组中有3 => new foo(),它将计为一个元素。如果你愿意,你可以检查它是否是string。这取决于具体情况。但是我认为你不需要!is_array($v)。请确认,我将从我的回答中删除该验证。
  • 我测试过了,你只需要if(!is_object($v)) 否则所有对象都会被算作一个元素,虽然对象内部的变量不会,但它们一直被忽略。
  • @rubo77 谢谢。看到你的 pastebin 链接,我会检查 string 类型。但是,最好在将来为其他用户的回答中保留object 验证,因为它更通用
【解决方案3】:

这是我的 PHP

/**
 * Counts only the real values, so array-elements
 * are not counted if they are another array.
 *
 * @param array $array
 * @return int
 * @author Muslim Idris
 */
function count_recursive($array) {
    $count = 0;
    foreach ($array as $v) {
            if (is_array($v)) $count += count_recursive($v);
            else $count++;
    }
    return $count;
}

【讨论】:

    【解决方案4】:

    我不能使用count($_REQUEST, COUNT_RECURSIVE),所以我使用了:

    function count_recursive($array) {
      $count = 0;
      foreach ($array as $id => $_array) {
        if (is_array ($_array)) $count += count_recursive ($_array);
        else $count += 1;
      }
      return $count;
    } 
    $num=count_recursive($_REQUEST);
    $max=ini_get('max_input_vars');
    $debug=true;
    if($debug and $max - $num < 50) {
      echo "Warning:Number of requests ($num) is near the value of max_input_vars:$max";
    }
    

    (虽然我的测试服务器上还有一个奇怪的东西,但那是另一个问题:why is the number of elements in $_REQUEST smaller than the limit i set by max_input_vars? 可能是 PHP 中的一个错误)

    【讨论】:

      【解决方案5】:

      查看以下链接了解使用计数功能的所有选项

      http://php.net/manual/en/function.count.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-26
        • 2016-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多