Перемещение элемента массива в PHP

$arr = array(
    'a1'=>'1',
    'a2'=>'2'
);

Мне нужно переместить a2 в начало, а также сохранить a2 в качестве ключа, как бы я продолжал об этом. Я не могу представить себе способ, не вникая в что-то:)

Ответ 1

Вы можете достичь этого следующим образом:

$arr = array(
    'a1'=>'1',
    'a2'=>'2'
);

end($arr);

$last_key     = key($arr);
$last_value   = array_pop($arr);
$arr          = array_merge(array($last_key => $last_value), $arr);

/*
    print_r($arr);

    will output (this is tested):
    Array ( [a2] => 2 [a1] => 1 )
*/

Ответ 2

Вот решение, которое корректно работает как с числовыми, так и с строковыми клавишами:

function move_to_top(&$array, $key) {
    $temp = array($key => $array[$key]);
    unset($array[$key]);
    $array = $temp + $array;
}

Это работает, потому что массивы в PHP - упорядоченные карты.
Btw, чтобы перемещать элемент снизу:

function move_to_bottom(&$array, $key) {
    $value = $array[$key];
    unset($array[$key]);
    $array[$key] = $value;
}

Ответ 3

Вот простой один лайнер, чтобы сделать это с помощью array_splice() и оператора union:

$arr = array('a1'=>'1', 'a2'=>'2', 'a3' => '3');
$arr = array_splice($arr,array_search('a2',array_keys($arr)),1) + $arr;

Ответ 4

попробуйте следующее:

$key = 'a3';
$arr = [
    'a1' => '1',
    'a2' => '2',
    'a3' => '3',
    'a4' => '4',
    'a5' => '5',
    'a6' => '6'
];
if (isset($arr[ $key ]))
    $arr = [ $key => $arr[ $key ] ] + $arr;

результат:

array(
    'a3' => '3',
    'a1' => '1',
    'a2' => '2',
    'a4' => '4',
    'a5' => '5',
    'a6' => '6'
)

Ответ 5

Вы также можете посмотреть array_multisort Это позволяет использовать один массив для сортировки другого. Это может, например, позволить вам экпортировать жестко закодированное упорядочение значений в файл конфигурации.

<?php
   $ar1 = array(10, 100, 100, 0);
   $ar2 = array(1, 3, 2, 4);
   array_multisort($ar1, $ar2);

   var_dump($ar1);
   var_dump($ar2);
?>

В этом примере после сортировки первый массив будет содержать 0, 10, 100, 100. Второй массив будет содержать 4, 1, 2, 3. Записи во втором массиве, соответствующие идентичным записям в первом массив (100 и 100) также были отсортированы.

Выходы:

array(4) {
  [0]=> int(0)
  [1]=> int(10)
  [2]=> int(100)
  [3]=> int(100)
}
array(4) {
  [0]=> int(4)
  [1]=> int(1)
  [2]=> int(2)
  [3]=> int(3)
}