Предложение Томаша относительно array_multisort() — умный, декларативный, и краткий метод, который был доступен в версиях php в течение многих лет. Я бы, скорее всего, использовал array_multisort()
, если бы эта задача была в моем проекте.
Я мог бы предложить для стабильности проекта (в случае расширения/изменения структуры данных) явно указать столбец для сортировки. Следующий фрагмент кода также позволяет избежать повторяющихся вызовов end()
.
array_multisort(array_column($array, 'cat_url_title'), SORT_NUMERIC, $array);
Я покажу пару современных альтернатив в качестве академического упражнения.
Начиная с PHP7, оператор космического корабля также имеет краткий синтаксис. Чтобы изолировать числовую подстроку перед первым дефисом, преобразуйте строки в целые числа.
usort($array, function($a, $b) {
return (int)$a['cat_url_title'] <=> (int)$b['cat_url_title'];
});
Начиная с PHP7.4, синтаксис стрелочной функции делает вызов usort()
более кратким, но возможно, более загадочным для чтения, если вы не привыкли к синтаксису.
usort($array, fn($a, $b) => (int)$a['cat_url_title'] <=> (int)$b['cat_url_title']);
Как и почти все мои сообщения о php, вот онлайн-демонстрация, чтобы доказать, что все мои фрагменты работают так, как задумано. .
Следует избегать фрагментов на этой странице, которые повторяют входной массив несколько раз.
p.s. если вы хотите отсортировать значения cat_url_title
в четырех числовых/алфавитных подстроках, вы можете записать эти подстроки в виде массивов с каждой стороны оператора космического корабля, и он будет оценивать подстроки слева направо, чтобы определить результаты сортировки.
Код: (Демо)
usort($array, function($a, $b) {
return (preg_match_all('~[a-z]+|\d+~', $a['cat_url_title'], $out) ? $out[0] : ['','','',''])
<=>
(preg_match_all('~[a-z]+|\d+~', $b['cat_url_title'], $out) ? $out[0] : ['','','','']);
});
p.p.s. Это хороший случай для version_compare()
. К сожалению, для строк в моей тестовой батарее это ненадежно. Обратите внимание на конечную позицию подмассива 16-a-20n
в этой демонстрации. Я считаю, что функция игнорирует последнюю букву, потому что оценка 0
между 16-a-20m
и 16-a-20n
.
Что касается ваших примеров строк с согласованными позициями подстрок a
и m
, то они отлично подходят для естественной сортировки.
Код: (Демо)
usort($array, function($a, $b) {
return version_compare($a['cat_url_title'], $b['cat_url_title']);
});
person
mickmackusa
schedule
11.12.2019