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

0

У меня есть список, содержащий кучу значений с 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
    Все диапазоны охватывают целые кратные 50? Если это так, вы можете легко избавиться от этой огромной конструкции if...elseif в конце.
Теги:
arrays
if-statement
range

2 ответа

0
Лучший ответ

Я бы перебирал ключи final_array, взрывая их, используя - как разделитель. Хотя этот метод медленнее, чем у вас, поскольку он final_array итерацию по 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню