2012-01-03 13 views
8

--- tablicy $ punktów ----pytania na tablicy Sortuj według czasu w 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 
      ) 

    ) 

Mam tablicę na powyżej chciałby uporządkować tę tablicę według czasu. Następnie użyłem kodu do sortowania, a wynik jest poprawny. Jednak jeśli zmieniłem kod time[$key] = $val[0] na $time = $val[0], wynik jest nieprawidłowy.

Czy jest ktoś, kto może mi to wyjaśnić? Wielkie dzięki!

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

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

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

Spróbuj tego testu: Usunięcie ostatniej linii ('array_mu ...'), skomentować go czy coś, a następnie wydrukować '$ oddać porównywalnych towarów po' foreach' pętli używając instrukcji 'time [$ key] = $ val [0]'. Następnie zmień linię na '$ time = $ val [0]' i zobacz, co '$ time' tworzy po pętli. – ladaghini

+0

Dzieje się tak ze względu na sposób działania 'array_multisort'. Sortuje wiele tablic, a gdy tablica '$ time' zostanie posortowana, tablica' $ points' zostanie ponownie uporządkowana zgodnie z indeksami tablicy w '$ time'. "Array_multisort" powinno jednak pochodzić po 'foreach'. – cmbuckley

Odpowiedz

7

array_multisort rodzaju więcej niż jeden raz w tablicy. Działa jednak na tablicę kolumn, więc pętla foreach jest potrzebna, aby uzyskać kolumnę czasów. Po zbudowaniu tej listy możesz następnie wykonać multisort. Macierz $points jest uporządkowana zgodnie z indeksami w $times, zgodnie z this example in the docs.

Jednak nie trzeba wykonywać sortowania wewnątrz foreach, ponieważ oznacza to, że sortowanie odbywa się 4 razy (w twoim przykładzie). To musi się zdarzyć tylko raz:

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

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

Co chcesz zrobić, to (idea):

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 

Po to masz tablicę point => time parach, posortowane według czasu. Aby uzyskać tylko punkty, na przykład zrobić

$points = array_keys($time); 
+0

Nie ma potrzeby robienia 'ksort()' wewnątrz pętli, która dodaje dodatkowe niepotrzebne obciążenie. Co więcej, całkowicie zmieniasz strukturę tablicy. – kba

+0

Miałeś rację co do tego, co się dzieje w pętli. – Rijk

3

Funkcja ausort() wykonuje funkcję porównanie oddzwonienia. Możesz użyć tego do porównania dwóch znaczników czasu.

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

Powyższy kod powróci

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

A skąd ten skrypt NIE dodaje niepotrzebnego narzut? : P Ciągi czasu są już sortable, cała rzecz, którą robisz z chodzeniem w tablicy i konwersją ich na znaczniki czasu jest śmieszna. Poza tym właśnie wymyśliłeś nową strukturę '$ arr'? Nie znalazłem tego w oryginalnym wpisie. Dzięki za upadek. – Rijk

+0

@Rijk Ta strona służy do pomocy, a nie bashowania. Dostałem ci konstruktywną krytykę na twoim kodzie. Jeśli jest jakiś problem, proszę powiedz mi, gdzie dokładnie można go poprawić. I nie, nie tworzę nowej struktury '$ arr'. – kba

+0

Albo całkowicie źle zrozumiałem pytanie, albo już ci powiedziałem. To także moja odpowiedź. – Rijk

Powiązane problemy