array_multisort с естественной сортировкой - PullRequest
5 голосов
/ 20 октября 2011

Можно ли отсортировать многомерный массив по нескольким столбцам, используя естественную сортировку в PHP? Вот пример. Предположим, у меня есть двумерный массив данных, например,

$array[1]['Name'] = 'John';
$array[1]['Age'] = '20';
$array[1]['Code'] = 'ABC 12';

$array[2]['Name'] = 'John';
$array[2]['Age'] = '21';
$array[2]['Code'] = 'ABC 1';

$array[3]['Name'] = 'Mary';
$array[3]['Age'] = '20';
$array[3]['Code'] = 'ABC 10';

Я хочу отсортировать этот массив по имени (ASC), затем по возрасту (DESC) и по коду (ASC), все будет отсортировано естественно. В основном это будет array_multisort с естественной сортировкой.

Я нашел много решений по этой теме в Интернете. К сожалению, они поддерживают сортировку только по одному столбцу, а не по нескольким.

Ответы [ 3 ]

6 голосов
/ 20 октября 2011

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

function myCmp($a, $b) {
 $nameCmp = strnatcasecmp($a['Name'], $b['Name']);
 $ageCmp = strnatcasecmp($a['Age'], $b['Age']);
 $codeCmp = strnatcasecmp($a['Code'], $b['Code']);

 if ($nameCmp != 0) // Names are not equal
   return($nameCmp);

 // Names are equal, let's compare age

 if ($ageCmp != 0) // Age is not equal
   return($ageCmp * -1); // Invert it since you want DESC

 // Ages are equal, we don't need to compare code, just return the comparison result
   return($codeCmp);
}

Тогда вы можете позвонить usort($array, 'myCmp'); и получить желаемую сортировку

1 голос
/ 28 марта 2013

Если вы используете PHP 5.4 или новее, вы можете использовать array_multisort с флагом SORT_NATURAL.

0 голосов
/ 20 октября 2011

Этот код поможет:

// Your original data stored in $array
$array[1]['Name'] = 'John';
$array[1]['Age'] = '20';
$array[1]['Code'] = 'ABC 12';

$array[2]['Name'] = 'John';
$array[2]['Age'] = '21';
$array[2]['Code'] = 'ABC 1';

$array[3]['Name'] = 'Mary';
$array[3]['Age'] = '20';
$array[3]['Code'] = 'ABC 10';

// Since array_multisort() needs arrays of columns we need to 
// transform it and preserve he keys
foreach ($array as $key => $row) {
    $names[$key] = $row['Name'];
    $ages[$key] = $row['Age'];
    $codes[$key] = $row['Code'];
}

// Sort it according to your criterias
array_multisort($names, SORT_ASC, $ages, SORT_DESC, $codes, SORT_ASC, $array);

// $array now contains your sorted array.

Ссылка на кодовую панель: http://codepad.org/tr83Wt5J

...