2009-04-22 3 views
55

У меня есть массив в следующем формате:Сортировка ассоциативного массива в PHP

Array 
(
    [0] => Array 
     (
      [text] => tests 
      [language] => 
      [advertiserCompetitionScale] => 5 
      [avgSearchVolume] => 7480000 
      [lastMonthSearchVolume] => 9140000 
     ) 

    [1] => Array 
     (
      [text] => personality tests 
      [language] => 
      [advertiserCompetitionScale] => 5 
      [avgSearchVolume] => 165000 
      [lastMonthSearchVolume] => 201000 
     ) 

    [2] => Array 
     (
      [text] => online tests 
      [language] => 
      [advertiserCompetitionScale] => 5 
      [avgSearchVolume] => 246000 
      [lastMonthSearchVolume] => 301000 
     ) 

) 

Как отсортировать массив в этом формате, в порядке убывания avgSearchVolume поля? Есть ли встроенная функция для этого?

+3

Это не является ассоциативным массивом ... но массив ассоциативных массивов ;-) –

ответ

92

Используйте usort и поставить свою собственную функцию, чтобы сделать заказ, например,

function cmp($a, $b) 
{ 
    return $b['avgSearchVolume'] - $a['avgSearchVolume']; 
} 

usort($array, "cmp"); 
+0

А также чтение http://stackoverflow.com/questions/8456029/how-does-usort-work#answer-8456055 также рекомендуется – vinrav

+0

Заменить 'return strcmp ($ a ['key'], $ b ['key']); 'сравнить строки –

+0

Спасибо! Это сэкономило много времени. – Simon

2

Это может помочь: Sorting Arrays of Arrays

+0

Это ответ только на ссылку, что совсем не хорошо – Zanshin13

+0

Это было 8 лет назад! – Aziz

+0

Да! И несмотря на то, что ссылка все еще работает, она может уйти в любой момент (или нет) :) – Zanshin13

8

Вы должны будете использовать пользовательскую функцию обратного вызова вместе с usort().

function cmp($a, $b) 
{ 
    if ($a['avgSearchVolume'] == $b['avgSearchVolume']) { 
     return 0; 
    } 
    return ($a['avgSearchVolume'] > $b['avgSearchVolume']) ? -1 : 1; 
} 
usort($array, 'cmp'); 
+0

Хотя это будет работать, функция сравнения должна действительно возвращать 0, если два сравниваемых элемента равны. –

+0

Вы правы Пол, но поскольку порядок сортировки не определен в случае равенства, лучшим решением было бы ввести другое сравнение для устранения этой неопределенности. Соответственно отредактировал ответ. –

18

До PHP 5.3 это лучшая функция для сортировки на основе подключей без создания новой функции для каждой клавиши.

function sortBySubkey(&$array, $subkey, $sortType = SORT_ASC) { 
    foreach ($array as $subarray) { 
     $keys[] = $subarray[$subkey]; 
    } 
    array_multisort($keys, $sortType, $array); 
} 
sortBySubkey($arr, 'avgSearchVolume'); 

С PHP 5.3 вы можете сделать что-то подобное, тот же вызов функции, что и сейчас.

function getSortVariable($sortType = SORT_ASC) { 
    switch($sortType) { 
     case SORT_ASC: 
      return function ($a, $b) use ($subkey) { return strcmp($a[$subkey], $b[$subkey]); }; 
    } 
} 

function sortBySubkey(&$array, $subkey, $sortType = SORT_ASC) { 
    $sortFunction = getSortVariable($sortType); 
    usort($array, $sortFunction($subkey)); 
} 
1

Вот еще одно решение, Вы можете добавить несколько вариантов сортировки (см комментируемой раздел кода)

<?php 

$arr=Array(
    Array("text" => "tests","language" =>"","advertiserCompetitionScale" => 5,"avgSearchVolume" => 7480000,"lastMonthSearchVolume" => 9140000), 
    Array("text" => "personality tests","language" =>"","advertiserCompetitionScale" => 5,"avgSearchVolume" => 165000,"lastMonthSearchVolume"=>201000), 
    Array("text" => "online tests","language" =>"","advertiserCompetitionScale" => 5,"avgSearchVolume" => 246000,"lastMonthSearchVolume" =>301000) 
    ); 


$sort = array(); 
foreach($arr as $k=>$v) { 
    $sort['avgSearchVolume'][$k] = $v['avgSearchVolume']; 
    //$sort['text'][$k] = $v['text']; 
} 

array_multisort($sort['avgSearchVolume'], SORT_DESC, $arr); 
//array_multisort($sort['avgSearchVolume'], SORT_DESC, $sort['text'], SORT_ASC,$arr); 

echo "<pre>"; 
print_r($arr); 

?> 

REF: http://php.net/manual/en/function.array-multisort.php

2
function querySort ($first_Array,$second_Array) { 
    return strcasecmp($first_Array['name'],$second_Array['name']); 
} 
echo '<pre>'; 
usort($main, 'querySort'); 

print_r($main); 
die; 
+0

Несколько слов объяснения сделают этот пример кода еще лучше. – Thom

Смежные вопросы