我有一个数组:
$array = array('a' => 'val1', 'b' => 'val2', 'c' => 'val3', 'd' => 'val4');
如何交换任意两个键,以便数组的顺序不同?例如。生成这个数组:
$array = array('d' => 'val4', 'b' => 'val2', 'c' => 'val3', 'a' => 'val1');
谢谢:)。
答案 0 :(得分:3)
我认为现在会有一个非常简单的答案,所以我会把我扔进去:
// Make sure the array pointer is at the beginning (just in case)
reset($array);
// Move the first element to the end, preserving the key
$array[key($array)] = array_shift($array);
// Go to the end
end($array);
// Go back one and get the key/value
$v = prev($array);
$k = key($array);
// Move the key/value to the first position (overwrites the existing index)
$array = array($k => $v) + $array;
这是交换数组的第一个和最后一个元素,保留键。我以为你最初想要array_flip()
,所以我希望我能正确理解。
答案 1 :(得分:2)
Best 一种方法是制作键和值的数组。交换两个阵列中的位置,然后将它们重新组合在一起。
function swapPos(&$arr, $pos1, $pos2){
$keys = array_keys($arr);
$vals = array_values($arr);
$key1 = array_search($pos1, $keys);
$key2 = array_search($pos2, $keys);
$tmp = $keys[$key1];
$keys[$key1] = $keys[$key2];
$keys[$key2] = $tmp;
$tmp = $vals[$key1];
$vals[$key1] = $vals[$key2];
$vals[$key2] = $tmp;
$arr = array_combine($keys, $vals);
}
答案 2 :(得分:1)
不理想,但做了你想做的事:
$array = array('a' => 'val1', 'b' => 'val2', 'c' => 'val3', 'd' => 'val4');
$keys = array_keys($array);
swap($keys, 0, 3);
$values = array_values($array);
swap($values, 0, 3);
print_r(array_combine($keys, $values)); // Array ( [d] => val4 [b] => val2 [c] => val3 [a] => val1 )
function swap (&$arr, $e1, $e2)
{
$temp = $arr[$e1];
$arr[$e1] = $arr[$e2];
$arr[$e2] = $temp;
}
当然,您还应该检查两个索引是否都在swap
函数中设置(使用isset
)
答案 3 :(得分:0)
您不能只将值存储到每个变量吗?
$val1 = $array[0];
$val2 = $array[3];
$array[0] = $val2;
$array[3] = $val1;
答案 4 :(得分:0)
您可以使用此函数将数组中的任何值交换为任何键。
/**
* switch value with value on key in given array
* array_switch( array( a, b ,c), c,0 );
* will return array(c, b, a);
*
*
* @param array $array
* @param mixed $value
* @param mixed $key
* @return array
*/
public static function array_switch(&$array, $value, $key)
{
// find the key of current value
$old_key = array_search($value, $array);
// store value on current key in tmep
$tmp = $array[$key];
// set values
$array[$key] = $value;
$array[$old_key] = $tmp;
return $array;
}
答案 5 :(得分:0)
我知道这已经很老了,但是我需要这个,并且找不到满意的东西。所以我自己滚了,决定分享。
仅使用一个简单的循环,该代码对任何人都是超级可读的。
我没有进行基准测试,但是我觉得与其他array_keys
,array_values
,array_combine
版本相比,它甚至还算不错,即使经过很长的时间。
应该同时适用于数字键和字符串键(仅使用字符串键进行测试)
如果未找到一个或两个键,然后抛出错误或返回原始数组,或者您需要执行任何操作,则执行检查也很容易
function arraySwap(array $array, $key1, $key2) {
$value1 = $array[$key1];
$value2 = $array[$key2];
$newArray = [];
foreach( $array as $key => $value ) {
if ($key === $key1) {
$newArray[$key2] = $value2;
} else if ($key === $key2) {
$newArray[$key1] = $value1;
} else {
$newArray[$key] = $value;
}
}
return $newArray;
}