Intereting Posts
Symfony2 и date_default_timezone_get () – Небезопасно полагаться на настройки часового пояса системы Интеграция блога tumblr с веб-сайтом Какой адрес электронной почты для использования в API аккаунта Google Service сохранить изображение в базу данных в php прямо из URL-адреса Изменить стек в Zend HeadScript View Helper Проверить дату обновления файла с помощью FTP-функций? при включении () или require () мне всегда нужно использовать ../../ относительно моего файла? Есть простой способ? Как декодировать eval (gzinflate (base64_decode ( Как скрыть ключ API на стороне клиента Javascript Загрузка файла, хотя AJAX POST как создать имя пользователя: пароль в файле .htpasswd на сервере Wamp, установленном на ОС Windows Не удалось создать XML-файл с этим большим URL-адресом Каков наилучший способ переместить файлы с одного сервера на другой с помощью PHP? Объяснение вывода phploc Что такое «достаточная дезинфекция» для URL

array_multisort с естественной сортировкой

Можно ли отсортировать массив с несколькими размерами несколькими столбцами, используя естественный вид в 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