2011-01-03 2 views
46

Я массив как этотPHP массив сортировать по два поля значения

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

Как я сортирует значение по return_fare возрастанию, one_way_fare возрастанию?

Я попытался array_multisort(), но я в конечном итоге получить перепутали данные ..

asort работает только для одного одномерного массива, мне нужно сортировать двумя значениями или более, как я могу добиться этого, как и в SQL, заказ по field1 asc, field2 asc?

ответ

73

array_multisort() является правильной функцией, вы должны иметь перепутались как-то:

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

Если вы посмотрите на комментарии на странице руководства РНР для array_multisort(), вы можете найти очень полезную array_orderby() функцию, которая позволяет вам укоротить выше только это:

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

чтобы избежать зацикливания использования array_column() (на PHP 5.5.0):

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

спасибо ..! Я думаю, что сделал это точно так же, как посоветовал. не может найти функцию array_orderby(), хотя на странице руководства пользователя – flyclassic

+2

@flyclassic, первый комментарий: http://www.php.net/manual/en/function.array-multisort.php#100534 –

+0

спасибо .. сейчас я вижу это .. – flyclassic

1

Оу, я сумел решить свой вопрос еще раз ....

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

Дело в том, я пропустил последний параметр массива $ на array_multisort($return_fares,$order,$one_way_fares,$order,$array);

ранее!

27

В дополнение к array_multisort(), который требует, чтобы вы сначала построили столбчатые массивы, есть также usort(), который не требует такой вещи.

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

Или, короче, 'return $ a ['return_fare'] - $ b ['return_fare']?: A ['one_way_fare'] - $ b ['one_way_fare'];' Все выглядит более естественным, чем 'array_multisort()' –

9

Или вы можете использовать uasort следующим

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 дает ошибку. – horse

+0

@ user2356198 какая ошибка вы получали.Не могли бы вы сообщить мне, потому что он работает отлично для меня. –

+0

Теперь все в порядке, только я не выбрал правильный компилятор. – horse

3

Другой пример использования оператора космического корабля.

usort($data, function($a, $b) { 
    return $a['return_fare'] <=> $b['return_fare'] ?: $a['one_way_fare'] <=> $b['one_way_fare'] 
}); 
Смежные вопросы