Я пытаюсь отсортировать массив (как с алфавитными, так и с цифровыми ключами) по ключам, где алфавитные ключи будут появляться сначала по алфавиту, а затем по числовым ключам.
Пытался ksort
со всеми доступными флагами, однако это не помогло. Пробовал несколько ТАК ответов, но ни один из них не служил моей цели. Вот пример массива у меня есть ..
$array = array(
'Bat' => array(),
'Dog' => array(),
'Apple' => array(),
'Cat' => array(),
1 => array(),
3 => array(),
2 => array(),
4 => array()
);
Мне нужно отсортировать это так:
$array = array(
'Apple' => array(),
'Bat' => array(),
'Cat' => array(),
'Dog' => array(),
0 => array(),
1 => array(),
2 => array(),
3 => array()
);
Что я понимаю из ответа SO, что для сортировки с использованием usort
функция. Вот где я потерялся. Любая помощь или руководство в правильном направлении будут оценены.
Спасибо
Если вы используете только английский алфавит и цифры, обычная функция ksort работает нормально
ksort($array);
print_r($array);
Пожалуйста, не возражайте против вопроса. Мне удалось добиться бу с помощью пользовательской функции. Я публикую ответ здесь, чтобы помочь, если кто-то сталкивается с этой проблемой.
function ev_sort_array( $array ) {
$alp = array();
$num = array();
foreach ( $array as $key => $value ) {
if ( is_numeric($key) ) {
$num[$key] = $value;
} else {
$alp[$key] = $value;
}
}
ksort( $alp );
ksort( $num );
return array_merge( $alp, $num );
}
Спасибо
Вы можете использовать uksort следующим образом:
$array = array(
'Bat' => array(),
'Dog' => array(),
'Apple' => array(),
'Cat' => array(),
1 => array(),
3 => array(),
2 => array(),
4 => array()
);
uksort($array,function($a,$b){
if(is_int($a)&&is_int($b)) return $a-$b;
if(is_int($a)&&!is_int($b)) return 1;
if(!is_int($a)&&is_int($b)) return -1;
return strnatcasecmp($a,$b);
});
print_r($array);
результат, как и ожидалось:
Array
(
[Apple] => Array
(
)
[Bat] => Array
(
)
[Cat] => Array
(
)
[Dog] => Array
(
)
[1] => Array
(
)
[2] => Array
(
)
[3] => Array
(
)
[4] => Array
(
)
)
Как говорит @ splash58, ksort () это все, что требуется.
Тем не менее, если данные вашего проекта упорядочивают числовые данные до алфавитного, и вам нужно изменить порядок этих групп в обратном порядке …
uksort () является наиболее прямой / подходящей функцией для этой работы.
* Тщательно выбирайте свою ключевую оценочную функцию:
true
— см. руководство."1"
будет оценивать false
,8
будет оценивать false
,Ваша логика сортировки гласит: при сравнении числа с не-числом переверните результат сортировки по умолчанию.
Если вы используете php7, вы можете использовать оператор космического корабля (<=>
). Если ваша версия php ниже 7, вы можете использовать любое сравнение с old-skool.
Мое решение позволяет оператору космического корабля заказывать ASC, когда оба значения являются числами или оба значения не являются числами. Когда одно число, а другое нет, поменяйте местами $a
а также $b
для заказа DESC.
Код: (демонстрация)
$array = [
2 => [],
'Bat' => [],
'Dog' => [],
'Cat' => [],
1 => [],
3 => [],
'Apple' => [],
4 => []
];
uksort($array, function ($a, $b){
return is_int($a) != is_int($b) ? $b <=> $a : $a <=> $b;
});
var_export($array);
Вывод: (да, я понимаю, что это не желаемый вывод, но это желаемая техника условного обращения порядка сортировки.)
array (
1 =>
array (
),
2 =>
array (
),
3 =>
array (
),
4 =>
array (
),
'Apple' =>
array (
),
'Bat' =>
array (
),
'Cat' =>
array (
),
'Dog' =>
array (
),
)