Сортировка многомерного массива в php - по значению - PullRequest
0 голосов
/ 14 февраля 2012

Например,

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

$usapopstats = array(
   array('New York',8008278),
   array('Los Angeles',3694820),
   array('Chicago',2896016),
   array('Houston',1953631),
   array('Philadelphia',1517550),
   array('Phonenix',1321045),
   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'=>1321045,
    'San Diego'=>1223400,
    'Dallas'=>1188580,
    'San Antonio'=>1144646,
    'Detroit'=>951270
 );
 asort($usapopstats);

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

1 Ответ

1 голос
/ 14 февраля 2012

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

$usapopstats = array(
    array('New York',8008278),
    array('Los Angeles',3694820),
    array('Chicago',2896016),
    array('Houston',1953631),
    array('Philadelphia',1517550),
    array('Phonenix',1321045),
    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',1321045),
    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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...