Можно ли отсортировать массив с несколькими размерами несколькими столбцами, используя естественный вид в 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 с естественной сортировкой.
Я нашел много решений по этой теме в Интернете. К сожалению, они поддерживают только сортировку по одному столбцу, а не по нескольким столбцам.
Я думаю, вы должны реализовать пользовательскую функцию сравнения для этого поведения:
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');
и должен получить желаемую сортировку
Если вы используете PHP 5.4 или новее, вы можете использовать array_multisort
с флагом SORT_NATURAL
.
Этот код сделал бы трюк:
// 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