我有一个包含1-400个值的列表。我试图将数据划分为[1-50],[51-100],..,[351-400]等范围,并获取在给定范围内的值的计数。我基本上有代码工作。所以,我的问题是有更好的方法来做到这一点或者什么是一个好的做法呢?
$temp = array(); //temp array to store the values from mysql
$final_array = array //final array to store the counts from the range initialized to 0
(
"0" => 0,
"1-50" => 0,
"51-100" => 0,
"101-150" => 0,
"151-200" => 0,
"201-250" => 0,
"251-300" => 0,
"301-350" => 0,
"351-400" => 0
);
$sql = "SELECT count(*) AS total FROM user GROUP BY user_id";
$statement = $DB_->link->prepare ( $sql );
$statement->execute ();
if ($result = $statement->get_result ())
{
while ( $row = $result ->fetch_assoc() )
{
$temp [] = $row;
}
}
else
{
die(mysql_error());
}
foreach ($temp as $child)
{
if( $child['total'] >= 351 && $child['total'] <= 400)
{
$final['351-400']++;
}
elseif( $child['total'] >= 301 && $child['total'] <= 350)
{
$final['301-350']++;
}
...
elseif( $child['total'] >= 1 && $child['total'] <= 50)
{
$final['1-50']++;
}
}
期望的结果
Array
(
[0] => 0
[1-50] => 1
[51-100] => 0
[101-150] => 0
[151-200] => 1
[201-250] => 0
[251-300] => 4
[301-350] => 5
[351-400] => 18
)
答案 0 :(得分:0)
我会迭代final_array
的键,使用-
作为分隔符对它们进行爆炸。虽然这个方法比你的方法慢,但是对于从数据库返回的每一行迭代final_array
,它更易于维护,因为它无缝地处理完全匹配的键(只有1个数字)和任意范围。添加更多存储桶只需要编辑final_array
数组,而不是更改一堆代码行。
foreach ($temp as $child) {
foreach($final_array as $key => $value) {
if (strpos($key, '-') === false) {
if ($child['total'] == intval($key)) {
$final_array[$key]++;
}
} else {
list($min, $max) = explode('-', $key);
if ($child['total'] >= intval($min) && $child['total'] <= intval($max)) {
$final_array[$key]++;
}
}
}
}
我也放弃使用$temp
数组,只需在返回结果时处理结果:
if ($result = $statement->get_result ())
{
while ( $child = $result->fetch_assoc() ) {
foreach($final_array as $key => $value) {
if (strpos($key, '-') === false) {
if ($child['total'] == intval($key)) {
$final_array[$key]++;
}
} else {
list($min, $max) = explode('-', $key);
if ($child['total'] >= intval($min) && $child['total'] <= intval($max)) {
$final_array[$key]++;
}
}
}
}
}
else
{
die(mysql_error());
}
最有效的系统会将所有结果加载到数组中,通过array_count_values
传递该数组,然后汇总这些数据。
答案 1 :(得分:0)
这是您使用过的最佳方式。对于单个键计数,我们使用PHP函数array_count_values