массивы — PHP получает количество значений, попадающих в ожидаемые диапазоны

У меня есть список, содержащий кучу значений от 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

Решение

Я бы перебрал ключи 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, а затем объединить их.

0

Другие решения

Это лучший способ, который вы использовали & для подсчета одного ключа мы используем функцию PHP array_count_values

0

По вопросам рекламы [email protected]