Например, у меня есть массив, подобный этому $array = ('a' => 2, 'b' => 1, 'c' => 4);
и мне нужно поменять a
на c
чтобы получить этот $array = ('c' => 4, 'b' => 1, 'a' => 2);
, Какой лучший способ сделать это без создания нового массива? Я знаю, что это возможно с XOR, но мне также нужно сохранять индексы.
array_splice
будет идеальным, но, к сожалению, он не сохраняет ключи в вставленных массивах. Поэтому вам придется прибегнуть к немного более ручной нарезке и нарезке:
function swapOffsets(array $array, $offset1, $offset2) { list($offset1, $offset2) = array(min($offset1, $offset2), max($offset1, $offset2)); return array_merge( array_slice($array, 0, $offset1, true), array_slice($array, $offset2, 1, true), array_slice($array, $offset1 + 1, $offset2 - $offset1 - 1, true), array_slice($array, $offset1, 1, true), array_slice($array, $offset2 + 1, null, true) ); }
Если вы хотите чисто поменять первую и последнюю позиции, вот один из способов сделать это:
$first = array(key($array) => current($array)); // Get the first key/value pair array_shift($array); // Remove it from your array end($array); $last = array(key($array) => current($array)); // Get the last key/value pair array_pop($array); // Remove it from the array $array = array_merge($last, $array, $first); // Put it back together
Дает тебе:
Array ( [c] => 4 [b] => 1 [a] => 2 )
Рабочий пример: http://3v4l.org/r87qD
Обновление: и просто для удовольствия, вы можете немного сжать это:
$first = array(key($array) => current($array)); $last = array_flip(array(end($array) => key($array))); $array = array_merge($last, array_slice($array,1,count($array) - 2), $first);
Рабочий пример: http://3v4l.org/v6R7T
Обновление 2:
О да, да, мы можем полностью сделать это в одной строке кода сейчас:
$array = array_merge(array_flip(array(end($array) => key($array))), array_slice($array,1,count($array) - 2), array_flip(array(reset($array) => key($array))));
Рабочий пример: http://3v4l.org/QJB5T
Это было весело, спасибо за вызов. знак равно