Сортировать многомерный массив по возрастанию и назначить подмассив, чтобы всегда быть первым

У меня есть многомерный массив:

$array = array (
"B" => array ("Banana", "Yello"),
"O" => array ("Orange", "Orange"),
"A" => array ("Apple", "Green"),
"S" => array ("Strawberry", "Red")
);

$o = $array['O']; // this is the letter O not zero
asort($array);
array_unshift($array, $o);

Теперь я хочу изменить порядок массива с помощью asort() но оставьте «О» в качестве первой записи:

O, A, B, S

Проблема в том, что я получаю

O, A, B, O, S

Как избавиться от второго «О»?

NB: я уже задавал похожий вопрос, но с другим массивом Вот

2

Решение

Вам просто нужно unset($array['O']);

<?php
$array = array (
"B" => array ("Banana", "Yello"),
"O" => array ("Orange", "Orange"),
"A" => array ("Apple", "Green"),
"S" => array ("Strawberry", "Red")
);

$o = $array['O']; // this is the letter O not zero
asort($array);
unset($array['O']);
array_unshift($array, $o);
print_r($array);
?>

Живая демоверсия: https://eval.in/855161

2

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

Попробуйте это сохранить ключ массива:

$array = array (
"B" => array ("Banana", "Yello"),
"O" => array ("Orange", "Orange"),
"A" => array ("Apple", "Green"),
"S" => array ("Strawberry", "Red")
);

$key = 'O';

asort($array);
$array = (array_key_exists($key, $array)) ? array($key => $array[$key]) + $array : $array;

echo '<pre>';
print_r($array);

http://www.phpwin.org/s/ltHbIV

http://php.net/manual/en/language.operators.array.php

Отредактировано с благодарностью @salathe

2

Лучше, чем вызывать несколько функций, было бы использовать одну функцию, предназначенную для пользовательской сортировки ключей. Это может быть немного трудным для чтения новым разработчиком PHP, но это правильный инструмент для работы …

* Обратите внимание, что эта пользовательская сортировка не завершится неудачей, если липкий ключ отсутствует, поэтому нет необходимости предварительно проверять, существует ли ключ в массиве.

Метод: uksort() (PHP<7 no-strcmp () Демо) (PHP<7 strcmp () Демо) (PHP7 + <=> Демо)

$array=["B"=>["Banana","Yello"],"O"=>["Orange","Orange"],"A"=>["Apple", "Green"],"S"=>["Strawberry","Red"]];

$sticky='O';

uksort($array,function($a,$b)use($sticky){
if($a===$sticky) return -1;  // prioritize if $a is sticky, regardless of $b
if($b===$sticky) return 1;  // deprioritize if $b is sticky match
/* PHP7+ technique:
return $a<=>$b;
*/
// or one of two PHP<7 techniques:
/*
if($a===$b) return 0;
return $a>$b?1:-1;
*/
return strcmp($a,$b);
});

var_export($array);

Выход:

array (
'O' =>
array (
0 => 'Orange',
1 => 'Orange',
),
'A' =>
array (
0 => 'Apple',
1 => 'Green',
),
'B' =>
array (
0 => 'Banana',
1 => 'Yello',
),
'S' =>
array (
0 => 'Strawberry',
1 => 'Red',
),
)
2
По вопросам рекламы [email protected]