2015-07-09 25 views
8

Sto correndo una query mysql e la matrice risultante è qualcosa di simile, che cambia ogni mese:gamma di riempimento con zeri

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

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

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

vorrei aggiungere giorni in modo da ottenere 31 giorni, quelli aggiunto sarebbe riempito con 0, in questo modo:

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 
    ) 
    ) 

mi piacerebbe riempire la matrice con 31 giorni, utilizzando i giorni e contare i dati che sono già lì ... come nel secondo esempio ... i giorni 1 e 3 wanst là ... quindi li ho aggiunti con il valore di conteggio 0 ... nell'ordine ... 1 ~ 31 giorni

la query è piuttosto semplice:

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

in modo che ogni mese ci regala diverse quantità di "giorni", qualche mese non c'è nessuna chiamata.

+0

completamente non corrisposto. ciò che vuoi ?? – MKD

+0

vuoi il conteggio cumulativo? –

+0

Voglio creare un nuovo array usando quello che ho ... con 31 giorni ... a volte il mio array ha 20 giorni, quelli che non sono lì dovrebbero essere aggiunti con il valore di conteggio 0 ... proprio come il esempio ... i giorni 1 e 3 non erano nel primo, quindi nel secondo sono ... con il valore di conteggio 0 – Edgar

risposta

2

provare anche questo, modificare range(1,10) secondo il vostro requisito

[[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))); 

?> 

uscita

[[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 
     ) 

) 

- Modifica per comment--

per la versione precedente di PHP che non ha 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

approccio fresco. – billynoah

+1

array_column è solo per php 5.5 quindi ho dovuto aggiornare il mio ... che dolore nel culo era ... ma funziona anche ... Proverò entrambi ... – Edgar

+1

@Edgar: ho modificato il mio post ha un aspetto, che supporta anche la versione precedente ora –

3

Si consiglia di creare una tabella di calendario nel database per contenere tutte le date. Quindi è possibile selezionare da questa tabella e lasciare unire gli altri dati per ottenere un conteggio totale al giorno. This article è un buon punto di partenza per creare una tabella di calendario e this stackoverflow post contiene una domanda simile e una risposta al tuo problema.

Ci sono soluzioni php così come l'iterazione un intervallo di date utilizzando il php costruito in DateTime e DateInterval Classi Come accennato in 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

Ho preso il -1 e aggiunto 'else {$ days [$ i] = array ('day' => $ i, 'count' => 0); } 'all'interno del foreach e ha funzionato, grazie – Edgar

+1

Questo crea un sacco di loop aggiuntivo non necessario. Potrebbe funzionare ma è inefficiente. – billynoah

1

Supponendo che si esegue questa operazione per più mesi di luglio prima impostare il tuo obiettivo mese come una variabile e ottenere la quantità di giorni:

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

Quindi eseguire la query e iterare i risultati per costruire un array indicizzato di giorno:

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

Ora si può fare un semplice for ciclo e riempire i pezzi mancanti:

for ($i = 1; $i <= $daysInMonth; $i++) { 
    if (!isset($results[$i])) { 
     $results[$i] = array(
      'day' => $i, 
      'count' => 0 
     ); 
    } 
}