PHP 计算预期范围内的值
PHP getting count for values that falls within expected ranges
我有一个列表,其中包含一系列 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
)
我会遍历 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
,然后聚合这些结果。
这是您使用的最佳方式 & 对于单键计数我们使用 PHP 函数 array_count_values
我有一个列表,其中包含一系列 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
)
我会遍历 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
,然后聚合这些结果。
这是您使用的最佳方式 & 对于单键计数我们使用 PHP 函数 array_count_values