Ключи массива сортировки PHP, начиная с 3-го символа ключа

array(4) {
    [D.Fletcher] = array(22) {
        [games] = int() 2
        [ab] = int() 6
        [runs] = int() 2
        [hits] = int() 2
    }
    [A.Slegers] = array(22) {
        [games] = int() 3
        [ab] = int() 0
        [runs] = int() 0
        [hits] = int() 0
    }
    [A.Eaton] = array(22) {
        [games] = int() 1
        [ab] = int() 2
        [runs] = int() 0
        [hits] = int() 0
    }
    [S.Ohtani] = array(22) {
        [games] = int() 3
        [ab] = int() 6
        [runs] = int() 2
        [hits] = int() 3
    }

Я хочу иметь возможность сортировать массив, начиная с третьего символа ключа.

Если я использую ksort, я получаю:

A.Eaton
A.Slegers
D.Fletcher
S.Ohtani

Но я хочу:

A.Eaton
D.Fletcher
S.Ohtani
A.Slegers

Я могу сделать этот SQL следующим образом: ВЫБЕРИТЕ * ИЗ баттеров в порядке SUBSTRING (имя, 3)

Но я не могу понять, как это сделать с помощью сортировки PHP. Я знаю, что могу получить ключи с

$keys=array_keys($arr);

или в цикле:

foreach ($arr as $key => $value) {
   echo $key;
}

Затем, возможно, выполните substr($key, 3), но я не могу понять, как собрать все это вместе для сортировки.

php.net/manual/en/function.uksort.phpuksort, Затем в вашей функции обратного вызова используйте подстроку, чтобы отрезать первые 2 буквы и ., затем ее substr($a,2) <=> substr($b,2) или что-то в этом роде в функции сортировки.
ArtisticPhoenix 08.02.2023 16:13

Для повышения эффективности сортировки PHP не делайте 2 вызова substr() на каждой итерации сортировки. Используйте array_multisort(array_map(fn($v) => substr($v, 2), array_keys($array)), $array); @user Этот подход вызывает substr() только один раз для каждого значения в массиве.

mickmackusa 08.02.2023 23:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как я сказал в комментариях

// Enter your code here, enjoy!
$array = [
    "D.Fletcher" => [],
    "A.Slegers" => [],
    "A.Eaton" => []
];


uksort($array, function($a,$b){
    return substr($a,2) <=> substr($b,2);
});

print_r($array);

Выход

Array
(
   [A.Eaton] => Array()
   [D.Fletcher] => Array()
   [A.Slegers] => Array()
)

тест

Лично я бы сделал на твоем месте:

Было бы выбрать данные с дополнительным полем, которое вы подставляете в SQL

Select SUBSTRING(name, 2) as sort_name ....

Затем вместо сортировки в БД из-за производительности теперь вы можете просто использовать их в качестве ключей для данных. Если возможно, лучше не использовать substr в сортировке, потому что это будет вызываться много раз. Это очень быстро, так что это не имеет большого значения. Но я избегаю использования . в ключах массива по другим причинам. У вас могут быть повторяющиеся имена, если вы удалите это, поэтому мне трудно сказать.

По сути, я бы построил данные, поэтому мне не нужно этого делать, вы все равно можете сортировать в PHP.

Также можно отсортировать это как многомерный массив по определенному ключу в каждом вложенном массиве, например, вы можете включить имя в подмассив и сделать функцию поиска для сортировки по этому. Я бы просто попытался избежать вызова substr так много. С точки зрения производительности это, вероятно, не имеет большого значения, это просто мой инстинкт.

уксорт пример сработал. Спасибо.

к вашему сведению. Я работаю на платформе, которая не поддерживает подсказку кода для PHP 7, поэтому возникает ошибка подсказки кода с использованием оператора космического корабля <=>. Использование strcmp также работает.

return strcmp( substr($a,2), substr($b,2) );

Другие вопросы по теме