2015-07-09 5 views
8

Я бегу запрос MySQL и полученный массив что-то вроде этого, что меняется каждый месяц:Заполнение массива нулями

Array( 
[0] => Array 
    (
     [day] => 2 
     [count] => 10 
    ) 

[1] => Array 
    (
     [day] => 4 
     [count] => 39 
    ) 

[2] => Array 
    (
     [day] => 5 
     [count] => 51 
    ) 
    ) 

я хотел бы добавить дни так что я получаю 31 дней, те, добавлена ​​будет заполнена с 0, как это:

Array( 
[0] => Array 
    (
     [day] => 1 
     [count] => 0 
    ) 

[1] => Array 
    (
     [day] => 2 
     [count] => 10 
    ) 

[2] => Array 
    (
     [day] => 3 
     [count] => 0 
    ) 

[3] => Array 
    (
     [day] => 4 
     [count] => 39 
    ) 
    ) 

Я хотел бы, чтобы заполнить массив с 31 дней, используя дни и рассчитывать данные, которые уже есть ... как во втором примере ... дни 1 и 3 были там ... поэтому я добавил их со значением счета 0 ... в порядке ... 1 ~ 31 день

Запрос довольно прост:

SELECT day(`dates`) day, count(`dates`) count FROM `calls` where month(dates) = 7 

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

+0

полностью неубранные. что ты хочешь ?? – MKD

+0

Вы хотите кумулятивный счет? –

+0

Я хочу создать новый массив, используя тот, который у меня есть ... с 31 днем ​​... иногда мой массив имеет 20 дней, те, которые там не там, должны быть добавлены со значением 0 ... точно так же, как пример ... дни 1 и 3 не были в первом, поэтому во втором они ... со значением счета 0 – Edgar

ответ

2

попробовать Кроме этого, изменить range(1,10) согласно вашему требованию

[[email protected] tmp]$ cat test.php 
<?php 

$array=array( 
       array("day"=>2,"count"=>10), 
       array("day"=>4,"count"=>39), 
       array("day"=>5,"count"=>51) 
      ); 


function modify_array($array,$range) 
{ 
    $tmp = array(); 
    array_map(function($_) use (&$tmp){ $tmp[$_] = array("day"=>$_,"count"=>0); },$range); 
    $output = array_combine(array_column($array,"day"), $array) + $tmp; 
    ksort($output); 
    return array_values($output); 
} 

// Output - modify range(1,10) as per your wish 
print_r(modify_array($array, range(1,10))); 

?> 

Выход

[[email protected] tmp]$ php test.php 
Array 
(
    [0] => Array 
     (
      [day] => 1 
      [count] => 0 
     ) 

    [1] => Array 
     (
      [day] => 2 
      [count] => 10 
     ) 

    [2] => Array 
     (
      [day] => 3 
      [count] => 0 
     ) 

    [3] => Array 
     (
      [day] => 4 
      [count] => 39 
     ) 

    [4] => Array 
     (
      [day] => 5 
      [count] => 51 
     ) 

    [5] => Array 
     (
      [day] => 6 
      [count] => 0 
     ) 

    [6] => Array 
     (
      [day] => 7 
      [count] => 0 
     ) 

    [7] => Array 
     (
      [day] => 8 
      [count] => 0 
     ) 

    [8] => Array 
     (
      [day] => 9 
      [count] => 0 
     ) 

    [9] => Array 
     (
      [day] => 10 
      [count] => 0 
     ) 

) 

- Edit для comment--

для старой версии PHP, который не имеет array_column

function modify_array($array,$range) 
{ 
    $tmp = array(); 
    array_map(function($_) use (&$tmp){ $tmp[$_] = array("day"=>$_,"count"=>0); },$range); 
    $output = array_combine(array_map(function($e){return $e["day"];}, $array), $array) + $tmp; 
    ksort($output); 
    return array_values($output); 
} 
+2

крутой подход. – billynoah

+1

array_column только для php 5.5, поэтому мне пришлось обновить мою ... какая боль в заднице была ... но она тоже работает ... Я собираюсь попробовать оба ... – Edgar

+1

@Edgar: Я редактировал мой пост имеет взгляд, который поддерживает более старую версию тоже сейчас –

3

Я бы рекомендовал создать таблицу календаря в вашей базе данных для хранения всех дат. Затем вы можете выбрать из этой таблицы и оставить свои другие данные, чтобы получить общее количество в день. This article - хорошее место, чтобы начать создавать таблицу календаря, а this stackoverflow post содержит похожие вопросы и ответы на ваши вопросы.

Есть PHP решений, а также такие, как итерация диапазона дат с помощью PHP, построенной в классах DateTime и DateInterval, как указаны в this stackoverflow question

0
$result = your database query result; 
$days = array(); 
for($i=0;$i<=31;$i++){ 
{ 
    foreach($result as $aresult){ 
     if(($aresult['day']-1)==$i){ 
      $days[i] = $aresult; 
      break; 
     } 
    } 
} 
+0

Я взял -1 и добавил 'else {$ days [$ i] = array ('day' => $ i, 'count' => 0); } 'внутри foreach, и это сработало, спасибо – Edgar

+1

Это создает много ненужного дополнительного цикла. Это может сработать, но это неэффективно. – billynoah

1

Предполагая, что вы делаете это в течение нескольких месяцев, чем июль, первый установить цель месяц в качестве переменной и получить количество дней:

$month = '7'; 
$daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, 2003); 

Затем запустите запрос и итерации по результатам построить массив, индексированный в день:

while ($row = $query->fetch_assoc()) { 
    $results[$row['day']] = $row; 
} 

Теперь вы можете сделать простой for петлю и заполнить недостающие части:

for ($i = 1; $i <= $daysInMonth; $i++) { 
    if (!isset($results[$i])) { 
     $results[$i] = array(
      'day' => $i, 
      'count' => 0 
     ); 
    } 
} 
Смежные вопросы