2012-02-14 3 views
0

Для примера.Сортировка многомерного массива в php - по значению

У меня есть следующая настройка массива, в которой есть каждый крупный американский город с его численностью населения.

$usapopstats = array(
    array('New York',8008278), 
    array('Los Angeles',3694820), 
    array('Chicago',2896016), 
    array('Houston',1953631), 
    array('Philadelphia',1517550), 
    array('Phonenix',45), 
    array('San Diego',1223400), 
    array('Dallas',1188580), 
    array('San Antonio',1144646), 
    array('Detroit',951270) 
); 

Я хочу отсортировать эту информацию по их размеру популяции. Но когда я попытался использовать функцию arsort, он сортирует массив по ключевым данным, а не данные значения, то есть отсортированные по городу.

Итак, мой вопрос в том, как вы программируете сортировку по размеру популяции для этого типа многомерного массива? Есть идеи?

Если массив были переписаны, как этот

$usapopstats = array(
    'New York'=>8008278, 
    'Los Angeles'=>3694820, 
    'Chicago'=>2896016, 
    'Houston'=>1953631, 
    'Philadelphia'=>1517550, 
    'Phoenix'=>45, 
    'San Diego'=>1223400, 
    'Dallas'=>1188580, 
    'San Antonio'=>1144646, 
    'Detroit'=>951270 
); 
asort($usapopstats); 

Это сортирует массив по численности населения.

+1

Возможный дубликат [Сортировка многомерного массива в PHP] (http://stackoverflow.com/questions/2059255/sorting-multidimensional-array-in-php) – jprofitt

+0

возможно просто манипулировать вашим вложенным массивом простым массивом значений ключа и 'asort()', что –

+0

usort() - http://www.php.net/manual/en/function.usort.php –

ответ

1

Вам нужно создать функцию пользователя сортировки (что это самый красивый и самый быстрый для решения программы:

$usapopstats = array(
    array('New York',8008278), 
    array('Los Angeles',3694820), 
    array('Chicago',2896016), 
    array('Houston',1953631), 
    array('Philadelphia',1517550), 
    array('Phonenix',45), 
    array('San Diego',1223400), 
    array('Dallas',1188580), 
    array('San Antonio',1144646), 
    array('Detroit',951270) 
); 

function sort_helper ($a, $b) { 
    if ($a[1] > $b[1]) return 1; 
    if ($a[1] == $b[1]) return 0; 
    return -1; 
} 

usort ($usapopstats, sort_helper); 
var_dump($usapopstats); 

Это не самый быстрый код, штраф за список скажем, до 1000 записей, но Я бы не сделал это с массивом со 100 000 записей. Для каждого сравнения вызывается функция sort_helper, и поскольку n log n-сравнение необходимо, это означает столько же вызовов функций.

Если вам это нужно для длинный список, кодировать популяцию в ключе и ksort:

$usapopstats = array(
    array('New York',8008278), 
    array('Los Angeles',3694820), 
    array('Chicago',2896016), 
    array('Houston',1953631), 
    array('Philadelphia',1517550), 
    array('Phonenix',45), 
    array('San Diego',1223400), 
    array('Dallas',1188580), 
    array('San Antonio',1144646), 
    array('Detroit',951270) 
); 

$statshelper = array(); 
foreach($usapopstats as $index=>$stat){ 
    $statshelper[$stat[1]."_".$index] = $stat; //also add the index to the key to avoid duplicates 
} 

ksort($statshelper, SORT_NUMERIC); //because the keys are strings (they contain an underscore) by default it will compare lexographically. The flag enforces numerical comparison on the part that can be converted to a number (i.e. the population) 
$usapopstats = array_values($statshelper); 

var_dump($usapopstats); 
+0

Спасибо Клоду. Ваше решение звучит. Хотя мне потребуется некоторое время, чтобы понять вашу часть алгоритма кода ksort. Я не дотрагивался до данных сортировки альтрогитов со времен моих колледжей, которые были похожи на десять лет назад! Поэтому я немного замедлил это. Что мне не получается, если функция array_values ​​должна возвращать значения массива statshelper в качестве нового массива для $ usapopstats array, не будут ли перезаписаны пары ключей/значений массива usapopstats? – awongCM

+0

Добро пожаловать :). Массив $ statshelper будет иметь все правильные данные в значениях, но некоторый «мусор», который нужен только для сортировки в ключах. Итак, '$ usapopstats = array_values ​​($ statshelper);' строка - это просто избавиться от этого мусора. Вы также можете сбросить переменную $ statshelper, чтобы увидеть разницу. – Claude

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