Задать вопрос
@vottakoinick

Есть ли такая функция сравнения?

Что бы сравнить строки " 1 строка", "2 строка", "11 строка" что бы учитывалось число спереди, а не первая цифра. А если числа нет то что бы по алфавиту сортировало.
Такой результат нужен:
1 строка
2 строка
11 строка


Я вот так делаю, но это только по первой цифре или букве.
usort($subcats, function ($a, $b) {
      return strcmp(mb_substr($a->name, 0, 1), mb_substr($b->name, 0, 1));
  });


Может пропустить через пару каких то функций? Понятно что я конечно могу вручную это сделать, выделить два первых символа проанализировать число или нет и тд. Просто вариантов может быть много, может уже есть какие то решения универсальные, сначала отсортировать как то по буквам, а потом по числам.
  • Вопрос задан
  • 309 просмотров
Подписаться 2 Простой 9 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Skillbox
    Профессия PHP-разработчик с нуля до PRO
    7 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
MrNull
@MrNull
Все довольно просто.
<?php
    usort($items, function ($a, $b) {

        $aStartsWithNumber = preg_match('/^\s*(\d+)/u', $a, $aMatch);
        $bStartsWithNumber = preg_match('/^\s*(\d+)/u', $b, $bMatch);

        // Оба начинаются с числа → сравниваем по числу
        if ($aStartsWithNumber && $bStartsWithNumber) {
            return (int)$aMatch[1] <=> (int)$bMatch[1];
        }

        // Только $a начинается с числа → он раньше
        if ($aStartsWithNumber) {
            return -1;
        }

        // Только $b начинается с числа → он раньше
        if ($bStartsWithNumber) {
            return 1;
        }

        // Ни один не начинается с числа → сортируем по алфавиту без учета регистра
        return mb_strtolower($a) <=> mb_strtolower($b);
    });
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы