2011-06-22 11 views
8

Mam niezespoloną tablicę, w której dane, które przychodzą, nie są sortowane (otrzymuję dane z zewnętrznego systemu i nie mogę wymusić, aby trafiły do ​​tablicy w posortowanej kolejności). Czy istnieje sposób sortowania wartości? Próbowałem to:Jak sortować tablicę razy chronologicznie?

$wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM"); 
$wedTrackTimes = array_unique($wedTrackTimes); 
$wedTrackTimes = sort($wedTrackTimes); 
print_r($wedTrackTimes); 

Ale zamiast wrócić posortowaną tablicę, zwraca 1. Jestem zakładając, że to dlatego, że jest non-asocjacyjne, więc nie ma żadnych kluczy. Czy istnieje sposób sortowania tablicy według wartości? Naprawdę potrzebujemy czasu 9:30 rano, aby odpadł po 8:15 rano, tak jak powinien.

UPDATE

Dzięki wszystkim za odpowiedzi; to spowodowało, że tablica została uporządkowana, ale nie zgodnie z oczekiwaniami. Jeśli używam domyślny typ sortowania, mam to:

Array 
(
    [0] => 12:30 PM-1:30 PM 
    [1] => 2:00 PM-3:00 PM 
    [2] => 3:30 PM-4:30 PM 
    [3] => 8:15 AM-9:15 AM 
    [4] => 9:30 AM-10:30 AM 
) 

Korzystanie SORT_NUMERIC uzyskać to:

Array 
(
    [0] => 2:00 PM-3:00 PM 
    [1] => 3:30 PM-4:30 PM 
    [2] => 8:15 AM-9:15 AM 
    [3] => 9:30 AM-10:30 AM 
    [4] => 12:30 PM-1:30 PM 
) 

Korzystanie SORT_STRING uzyskać to:

Array 
(
    [0] => 12:30 PM-1:30 PM 
    [1] => 2:00 PM-3:00 PM 
    [2] => 3:30 PM-4:30 PM 
    [3] => 8:15 AM-9:15 AM 
    [4] => 9:30 AM-10:30 AM 
) 

Co potrzebne jest:

Array 
(
    [0] => 8:15 AM-9:15 AM 
    [1] => 9:30 AM-10:30 AM 
    [2] => 12:30 PM-1:30 PM 
    [3] => 2:00 PM-3:00 PM 
    [4] => 3:30 PM-4:30 PM 


) 

Czy to możliwe?

Odpowiedz

5

Wygląda więc na to, że szukasz czegoś bardziej zaawansowanego niż standardowy.

// WARNING: THIS IS *NOT* BY REFERENCE. IT RETURNS A NEW ARRAY. 
function getSortedTimes(array $group) 
{ 
    $tmp = array(); 
    foreach($group as $times) 
    { 
     // Basically, I am pairing the string for the start time with 
     // a numeric value. 
     $tmp[$times] = strtotime(substr($times, 0, strpos($times, '-'))); 
    } 
    // asort is like sort, but it keeps the pairings just created. 
    asort($tmp); 
    // the keys of $tmp now refer to your original times. 
    return array_keys($tmp); 
} 
21

Sortuj działa poprzez odniesienie (to znaczy, że sortuje cokolwiek przekazać do niego), to zwraca true/false oparty na niepowodzenie. Co tutaj robisz:

$wedTrackTimes = sort($wedTrackTimes); 

przypisuje wartość $ wedTrackTimes do wartości PRAWDA lub FAŁSZ.

Spróbuj

sort($wedTrackTimes); 
print_r($wedTrackTimes); 
+0

Ups, nie są jeszcze zakończone. Działało, w tym sensie, że było sortowane, ale nie sortowało zgodnie z oczekiwaniami. Szczegółowe informacje można znaleźć w części OP ... – EmmyS

+0

Wygląda na to, że potrzebujesz niestandardowej funkcji. – cwallenpoole

+0

Pytanie zostało zaktualizowane 17 minut po wysłaniu. Następnie wyjaśniono, że standardowy rodzaj nie był wystarczający. Wymagany był rodzaj chronologiczny. Ta odpowiedź nie zapewnia pożądanego wyniku sortowania. – mickmackusa

5

To prawda, sortowanie powraca bool. Wystarczy użyć że:

sort($wedTrackTimes); 
5

sort, jak wszystkie PHP sorting functions, sortuje w miejscu. Zwraca wartość true, jeśli sortowanie zakończyło się powodzeniem, w przeciwnym wypadku false. Ten wynik nie ma znaczenia, jeśli sortujesz tylko ciągi/liczby.

$wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", 
         "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM"); 
$wedTrackTimes = array_unique($wedTrackTimes); 
sort($wedTrackTimes); 
print_r($wedTrackTimes); 

to droga.

2

zmienić swój kod do tego:

$wedTrackTimes = array_unique($wedTrackTimes); 
sort($wedTrackTimes); 
print_r($wedTrackTimes); 

jak można przeczytać w the documentation, wartość zwracana sort() prawda/fałsz lub 1/0 i wskazuje, czy sortowania było możliwe albo wystąpił błąd.

2

Usuń $ wedTrackTimes = przed sortowaniem.

$wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM"); 
$wedTrackTimes = array_unique($wedTrackTimes); 
sort($wedTrackTimes); 
print_r($wedTrackTimes); 
0

W kodzie

$wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM"); 
$wedTrackTimes = array_unique($wedTrackTimes); 
**$wedTrackTimes = sort($wedTrackTimes);** 
print_r($wedTrackTimes); 

Nie należy przypisywać zmiennej funkcji, zasadzie to, co robisz jest przypisanie wartości sort (która będzie prawda czy fałsz) do wedTrackTimes, zamiast uporządkować Takie wykorzystanie

$wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM"); 
    $wedTrackTimes = array_unique($wedTrackTimes); 
    **sort($wedTrackTimes);** 
    print_r($wedTrackTimes); 
0

ROZWAGĄ sortowania na czas (chronologicznie) wezwie do strtotime().

Oto jedna linijka dla ciebie używająca array_multisort(). array_map() i strtotime() są wywoływane w celu wygenerowania tablicy, która będzie używana wyłącznie do sortowania.

array_multisort(array_map(function($v){return strtotime(strstr($v,'-',true));},$wedTrackTimes),$wedTrackTimes); 

Dla każdego, kto zagubił się w tej składni, tutaj jest ta sama funkcjonalność w przypadku większej liczby linii.

Kod: (Demo)

$wedTrackTimes=[ 
    "9:30 AM-10:30 AM", 
    "8:15 AM-9:15 AM", 
    "12:30 PM-1:30 PM", 
    "2:00 PM-3:00 PM", 
    "3:30 PM-4:30 PM" 
]; 

foreach($wedTrackTimes as $time){ // iterate the time strings 
    $timestamps[]=strtotime(strstr($time,'-',true)); // store the first time of the time range as a unix timestamp 
} 
array_multisort($timestamps,$wedTrackTimes); // use $timestamps to sort $wedTrackTimes 

var_export($wedTrackTimes); 

wyjściowa:

array (
    0 => '8:15 AM-9:15 AM', 
    1 => '9:30 AM-10:30 AM', 
    2 => '12:30 PM-1:30 PM', 
    3 => '2:00 PM-3:00 PM', 
    4 => '3:30 PM-4:30 PM', 
) 
Powiązane problemy