Отображать годовой отчет, когда данные недоступны (CI, PHP, MySQL) - PullRequest
1 голос
/ 13 ноября 2011

Я хочу отображать годовой отчет по месяцам, скажем, у меня есть заказы в январе, августе и декабре, но в остальное время заказов нет.

Когда я запрашиваю с помощью CI

select month(order_date) as month_name,
       count(order_id) as amount 

from order 
where year(order_date) = 2011 
group by month(order_date)

Возвращено только 3 строки.

Скажи, что я тогда делаю это: use $query->result_array()

Array ([0] => Array ( [month_num] => 1 [amount] => 4 )
       [1] => Array ( [month_num] => 8 [amount] => 1 ) 
       [2] => Array ( [month_num] => 12 [amount] => 19 )
      )

Это хорошо, но мне нужно заполнить оставшуюся часть года недостающими месяцами. Если месяц отсутствует в базе данных, мне нужно установить нулевую сумму по умолчанию.

По сути, я получу массив со всеми месяцами года со значениями, взятыми из базы данных, или ноль, если месяц не существует.

Ответы [ 2 ]

1 голос
/ 13 ноября 2011

Я не уверен, возможно ли это сделать в SQL. Это может быть.

Вот решение, использующее только PHP.

$orders = array(
    array(
        'month_num' => 1,
        'amount' => 4
    ),
    array(
        'month_num' => 2,
        'amount' => 0
    ),   
    array(
        'month_num' => 3,
        'amount' => 4
    )
);

$report = array_combine( range( 1, 12), array_fill( 1, 12, 0));
foreach( $orders as $order)
{
    $report[ $order['month_num'] ] = $order['amount'];
}

var_dump( $report);

Вы также можете избежать многомерного массива, если вы используете ключи в качестве номера месяца и значение в качестве количества заказов (как в ответе выше):

$orders = array( 1 => 4, 2 => 0, 3 => 0, 4 => 0);

Тогда вы можете сформировать отчет в одну строку:

$report = array_replace( array_combine( range( 1, 12), array_fill( 1, 12, 0)), $orders);

Демо

0 голосов
/ 13 ноября 2011
$month_array = Array ( [0] => Array ( [month_num] => 1 [amount] => 4 ) [1] => Array ( [month_num] => 8 [amount] => 1 ) [2] => Array ( [month_num] => 12 [amount] => 19 ) );

$new_month_array = array();
foreach( $month_array as $month ){
    $new_month_array[] = $month;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...