2012-01-03 13 views
8

--- array $ punti ----domande sul sorta di matrice di orario di php

Array 
    (
     [0] => Array 
      (
       [0] => 2011-10-02 05:30:00 
       [1] => 20 
      ) 

     [1] => Array 
      (
       [0] => 2011-10-04 09:30:00 
       [1] => 12 
      ) 

     [2] => Array 
      (
       [0] => 2011-10-01 13:30:00 
       [1] => 25 
      ) 

     [3] => Array 
      (
       [0] => 2011-10-03 02:30:00 
       [1] => 31 
      ) 

    ) 

mi hanno una serie al di sopra e vorrei ordinare questo array dal tempo. Quindi ho usato il codice come segue per ordinare e il risultato è corretto. Tuttavia, se ho cambiato il codice time[$key] = $val[0] a $time = $val[0], il risultato è sbagliato.

C'è qualcuno in grado di spiegarmelo? Grazie molto!

foreach($points as $key=>$val){ 

     $time[$key] = $val[0]; 

     array_multisort($time, SORT_ASC, $points); 
    } 
+0

Prova questo test: Rimuovere l'ultima riga ('array_mu ...'), commentarla o qualcosa del genere, e poi stampare '$ time' dopo il ciclo' foreach' usando l'istruzione 'time [$ key] = $ val [0]'. Quindi, cambia la linea in '$ time = $ val [0]' e guarda cosa '$ time' produce dopo il ciclo. – ladaghini

+0

Questo è dovuto al modo in cui 'array_multisort' funziona. Ordina ordinamenti multipli e quando l'array '$ time' viene ordinato, l'array' $ points' viene riordinato secondo gli indici dell'array in '$ time'. Il 'array_multisort' dovrebbe venire dopo il' foreach', però. – cmbuckley

risposta

7

array_multisort tipi più di un array in una volta. Tuttavia, funziona su una matrice di colonne, quindi il ciclo foreach è necessario per ottenere una colonna dei tempi. Dopo aver creato questo elenco, puoi quindi eseguire il multisort. L'array $points viene ordinato in base agli indici in $times, come da this example in the docs.

Tuttavia, non è necessario eseguire l'ordinamento all'interno dello foreach, poiché ciò significa che l'ordinamento si verifica 4 volte (nell'esempio). Deve accadere solo una volta:

foreach ($points as $key => $val) { 
    $time[$key] = $val[0]; 
} 

array_multisort($time, SORT_ASC, $points); 
-2

Che cosa si vuole fare è (idea di base):

foreach($points as $key=>$val){ 
    $time[$val[1]] = $val[0]; // $time will be an array of [ point => time ] pairs 
} 
asort($time); // sorts the array and maintains indexes 

Dopo questo si dispone di una serie di point => time coppie, ordinati per tempo. Per ottenere solo i punti, per esempio fare

$points = array_keys($time); 
+0

Non c'è bisogno di fare 'ksort()' all'interno del ciclo, che aggiunge solo un sovraccarico inutile. Inoltre, stai cambiando completamente la struttura dell'array. – kba

+0

Avevi ragione riguardo alla cosa del ciclo, però. – Rijk

3

La funzione ausort() prende una funzione di confronto di callback. Puoi usare questo per confrontare due timestamp.

$arr = array(
     array('2011-10-02 05:30:00','20'), 
     array('2011-10-04 09:30:00','12'), 
     array('2011-10-01 13:30:00','25'), 
     array('2011-10-03 02:30:00','31') 
); 

function timecomp($a,$b) 
{ 
    // Subtracting the UNIX timestamps from each other. 
    // Returns a negative number if $b is a date before $a, 
    // otherwise positive. 
    return strtotime($b[0])-strtotime($a[0]); 
} 
uasort($arr,'timecomp'); 

print_r($arr); 

Il codice precedente restituirà

(
    [1] => Array 
     (
      [0] => 2011-10-04 09:30:00 
      [1] => 12 
     ) 

    [3] => Array 
     (
      [0] => 2011-10-03 02:30:00 
      [1] => 31 
     ) 

    [0] => Array 
     (
      [0] => 2011-10-02 05:30:00 
      [1] => 20 
     ) 

    [2] => Array 
     (
      [0] => 2011-10-01 13:30:00 
      [1] => 25 
     ) 

) 
+1

E in che modo questo script NON aggiunge un sovraccarico inutile? : P Le stringhe del tempo sono già ordinabili, l'intera cosa che fai con il camminare sull'array e convertirli in timestamp è ridicola. Inoltre, hai appena inventato una nuova struttura '$ arr' o qualcosa del genere? Non l'ho trovato nel post originale. Grazie per il downvote. – Rijk

+0

@Rijk Questo sito è per aiutare, non per colpire. Ti ho dato delle critiche costruttive sul tuo codice. Se c'è un sovraccarico, per favore dimmi esattamente dove può essere migliorato. E no, non sto creando una nuova struttura '$ arr'. – kba

+0

O ho completamente frainteso la domanda, o te l'ho già detto. È anche nella mia risposta. – Rijk