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 не делайте 2 вызова substr()
на каждой итерации сортировки. Используйте array_multisort(array_map(fn($v) => substr($v, 2), array_keys($array)), $array); @user Этот подход вызывает substr()
только один раз для каждого значения в массиве.
Как я сказал в комментариях
// 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) );
uksort
, Затем в вашей функции обратного вызова используйте подстроку, чтобы отрезать первые 2 буквы и.
, затем ееsubstr($a,2) <=> substr($b,2)
или что-то в этом роде в функции сортировки.