PHP сортирует ключи массива по алфавиту, а затем по номерам

Я пытаюсь отсортировать массив (как с алфавитными, так и с цифровыми ключами) по ключам, где алфавитные ключи будут появляться сначала по алфавиту, а затем по числовым ключам.

Пытался 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 функция. Вот где я потерялся. Любая помощь или руководство в правильном направлении будут оценены.

Спасибо

0

Решение

Если вы используете только английский алфавит и цифры, обычная функция ksort работает нормально

ksort($array);
print_r($array);

демонстрация

3

Другие решения

Пожалуйста, не возражайте против вопроса. Мне удалось добиться бу с помощью пользовательской функции. Я публикую ответ здесь, чтобы помочь, если кто-то сталкивается с этой проблемой.

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 );
}

Спасибо

2

Вы можете использовать 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
(
)

)
2

Как говорит @ splash58, ksort () это все, что требуется.

Тем не менее, если данные вашего проекта упорядочивают числовые данные до алфавитного, и вам нужно изменить порядок этих групп в обратном порядке …

uksort () является наиболее прямой / подходящей функцией для этой работы.

* Тщательно выбирайте свою ключевую оценочную функцию:

  • is_numeric () имеет широкое определение того, что квалифицируется как true — см. руководство.
  • is_int () (и его псевдоним is_integer ()) очень строг в проверке типа данных. Важно отметить, что ключ строки "1" будет оценивать false,
  • ctype_digit (), требуя, чтобы все символы были числовыми, не работает со значениями нестрокового типа. Важно, что не строковый ключ, как 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 (
),
)
2
По вопросам рекламы [email protected]