所以我有一个数组,它有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选择吗?只是使用计数(*)?会更有效率吗?
答案 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
是“包含”。