Как поменять два значения в массиве с помощью индексов?

Например, у меня есть массив, подобный этому $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

Это было весело, спасибо за вызов. знак равно