如何用索引交换数组中的两个值


How to swap two values in array with indexes?

例如,我有一个像这样的数组$array = ('a' => 2, 'b' => 1, 'c' => 4);,我需要用c交换a才能得到这个$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

很有趣,谢谢你的挑战