2011-01-03 25 views
46

buPHP sıralama dizi asc one_way_fare,

 
Array (
[0] => Array("destination" => "Sydney", 
       "airlines" => "airline_1", 
       "one_way_fare" => 100, 
       "return_fare => 300 
     ), 
[2] => Array("destination" => "Sydney", 
       "airlines" => "airline_2", 
       "one_way_fare" => 150, 
       "return_fare => 350 
     ), 
[3] => Array("destination" => "Sydney", 
       "airlines" => "airline_3", 
       "one_way_fare" => 180, 
       "return_fare => 380 
     ) 
) 

gibi bir dizi Nasıl return_fare asc ile değerini sıralayabilir ettik değerleri?

Ben array_multisort() çalıştı ama ben, ben SQL, sipariş tarafından böyle nasıl elde edebileceğini, iki değer veya daha fazla göre sıralamak gerekir

asort tek boyutlu bir dizi için çalışır .. karışık veri alma sona erdi field1 asc, field2 asc?

cevap

73

array_multisort() doğru fonksiyon, bir şekilde berbat olmalı edilir: Eğer array_multisort() için PHP'nin manuel sayfasından yorumlarına bir göz atacak olursak

// Obtain a list of columns 
foreach ($data as $key => $row) { 
    $return_fare[$key] = $row['return_fare']; 
    $one_way_fare[$key] = $row['one_way_fare']; 
} 

// Sort the data with volume descending, edition ascending 
array_multisort($return_fare, SORT_ASC, $one_way_fare, SORT_ASC, $data); 

, size izin veren bir çok yararlı array_orderby() fonksiyonunu bulabilirsiniz sadece bu yukarıdaki kısaltmak için:

$sorted = array_orderby($data, 'return_fare', SORT_ASC, 'one_way_fare', SORT_ASC); 

(PHP 5.5.0 itibariyle) döngü kullanımını array_column() kaçınmak için:

array_multisort(array_column($data, 'return_fare'), SORT_ASC, 
       array_column($data, 'one_way_fare'), SORT_ASC, 
       $data); 
+0

teşekkürler ..! Sanırım aynısını tavsiye ettim. manuel sayfa yorumları – flyclassic

+2

@flyclassic olsa da array_orderby() işlevini bulamıyorum, ilk yorum: http://www.php.net/manual/en/function.array-multisort.php#100534 –

+0

teşekkürler ... şimdi Onu görüyorum .. – flyclassic

1

Ohh, ben .... tekrar Kendi sorumu çözmek için

function array_multi_sort($array, $on1,$on2, $order=SORT_ASC) 
{ 

    foreach($array as $key=>$value){ 
     $one_way_fares[$key] = $value[$on2]; 
     $return_fares[$key] = $value[$on1]; 
    } 

    array_multisort($return_fares,$order,$one_way_fares,$order,$array); 
} 

yönetilen şey i daha önce array_multisort($return_fares,$order,$one_way_fares,$order,$array);

son parametre $ dizi kaçırmış olduğunu!

27

İlk olarak sütun dizileri oluşturmanızı gerektiren array_multisort()'a ek olarak, böyle bir şeye gerek duymayan usort() da vardır.

usort($data, function($a, $b) { 
    $rdiff = $a['return_fare'] - $b['return_fare']; 
    if ($rdiff) return $rdiff; 
    return $a['one_way_fare'] - $b['one_way_fare']; 
}); // anonymous function requires PHP 5.3 - use "normal" function earlier 
+7

Ya da daha da önemlisi, '$ a ['return_fare'] - $ b ['return_fare'] ?: a ['one_way_fare'] - $ b ['one_way_fare'];' 'herşey array_multisort() 'den daha doğal –

9

Ya

uasort($arr, function($a,$b){ 
    $c = $a['return_fare'] - $b['return_fare']; 
    $c .= $a['one_way_fare'] - $b['one_way_fare']; 
    return $c; 
}); 

Fiddle

+0

Fiddle hata veriyor. – horse

+0

@ user2356198 elde edeceğiniz hata.Benim için iyi çalışmasına izin verir misiniz lütfen bana bildirin –

+0

Şimdi tamam, sadece doğru derleyici seçmedim. – horse

3

uzay operatörü kullanılarak başka örnek aşağıdaki gibi uasort kullanabilirsiniz.

usort($data, function($a, $b) { 
    return $a['return_fare'] <=> $b['return_fare'] ?: $a['one_way_fare'] <=> $b['one_way_fare'] 
});