计算具有特定数组值的行数

时间:2012-03-02 15:43:28

标签: php loops count

所以我有一个数组,它有1000行,一列包含用户的年龄,我试图确定如何计算<17,17-25,26-40的人的行数等

我知道这可以通过for循环来实现:

for($i=0,$i<$totalrows,$i++)
    $birthdate=$array[$i][birthdate];
    if($birthdate>1995)
    {
        $seventeen=$seventeen+1;
    }
    elseif
    {
        etc...

但是是否有内置函数可以执行此操作而不需要执行for循环来计算所有值?一旦计数达到数百万,这对服务器来说不会变得非常沉重吗?

编辑/我应该使用5种不同的SQL选择吗?只是使用计数(*)?会更有效率吗?

3 个答案:

答案 0 :(得分:1)

您可以使用array_filter(),然后使用count()返回值。

$seventeen = count(array_filter($array,
                                function ($entry) { 
                                    return ($entry['birthdate'] > 1995); 
                                }
                               )
                  )

N.B。除非你已经将“birthdate”定义为常量,否则你应该引用它以便它被视为一个字符串

答案 1 :(得分:1)

你可以在获取数据时使用sql进行计数。就处理性能而言,这一切都取决于查询请求。

至于PHP,你可以做的是创建一个多维数组。

$arr = array(
    '0-16' => array(

    ),
    '17-25' => array(

    ),
    '26-40' => array(

    )
);

当您获取组时,将它们添加到组

while ($query as $result) {
    if ($result['age'] < 17) {
        $arr['0-16']['age'] = $result['age'];
        $arr['0-16']['name'] = $result['name'];
    }
}

然后做一个计数

echo count($arr['0-16'])

通过这种方式,您始终可以print_r拥有所需组的数组并进一步操作该组。

答案 2 :(得分:0)

是的,如果这些数据来自数据库,那么您应该对该数据库进行分组和计数。

在发布年份,以下查询将生成以下结果集。 (Demo

SELECT
    SUM(IF(birth_year > (YEAR(CURDATE()) - 17), 1, 0)) under_seventeen,
    SUM(IF(birth_year BETWEEN YEAR(CURDATE()) - 25 AND YEAR(CURDATE()) - 17, 1, 0)) under_twentysix,
    SUM(IF(birth_year BETWEEN YEAR(CURDATE()) - 40 AND YEAR(CURDATE()) - 26, 1, 0)) under_fortyone,
    SUM(IF(birth_year < YEAR(CURDATE()) - 41, 1, 0)) masters
FROM users

模式:

CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `birth_year` int(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `users` (`birth_year`)
VALUES
    (1993),  -- 26yo , G3
    (1941),  -- 78   , G4
    (1965),  -- 54   , G4
    (1995),  -- 24   , G2
    (1979),  -- 40   , G3
    (1980),  -- 39   , G3
    (2000),  -- 19   , G2
    (1929),  -- 90   , G4
    (1951),  -- 68   , G4
    (2002),  -- 17   , G2
    (1994),  -- 25   , G2
    (2003);  -- 16   , G1

结果集:

| under_seventeen | under_twentysix | under_fortyone | masters |
| --------------- | --------------- | -------------- | ------- |
| 1               | 4               | 3              | 4       |

*请注意,MySQL的BETWEEN是“包含”。