У меня есть многомерный массив:
$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: я уже задавал похожий вопрос, но с другим массивом Вот
Вам просто нужно 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
Попробуйте это сохранить ключ массива:
$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
Лучше, чем вызывать несколько функций, было бы использовать одну функцию, предназначенную для пользовательской сортировки ключей. Это может быть немного трудным для чтения новым разработчиком 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',
),
)