我有一个数组:
$array = array(
'a' => 'val1',
'b' => 'val2',
'c' => 'val3',
'd' => 'val4'
);
如何通过键交换任意两个元素(例如
a
和 d
)以生成此数组:
$array = array(
'd' => 'val4',
'b' => 'val2',
'c' => 'val3',
'a' => 'val1'
);
我想现在会有一个非常简单的答案,所以我把我的答案扔进一堆:
// 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()
,所以希望我理解正确。
最佳 一种方法是创建键和值的数组。 交换两个数组中的位置,然后将它们放回一起。
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);
}
不理想,但可以做你想做的事:
$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
)
您可以使用此函数将数组中的任何值交换为任何键。
/**
* 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;
}
我知道这已经很旧了,但我需要这个,但找不到任何令人满意的东西。所以我自己推出了,并决定分享。
仅使用一个简单的循环,这段代码对任何人来说都非常可读。
我没有进行基准测试,但我有一种感觉,与其他
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;
}
将键交换声明为自反关联数组。 然后将映射的数据推入结果数组中。如果在交换数组中找不到,则在遍历输入数组时将元素直接转移到结果数组。
这个过程可以容纳多对交换甚至链式交换。 请注意,在交换数组中,“值”是要移动的元素的键,“键”是基于原始键位置的目的地。 演示
$array = ['a' => 'val1', 'b' => 'val2', 'c' => 'val3', 'd' => 'val4', 'e' => 'val5'];
$swaps = ['a' => 'd', 'd' => 'a'];
$result = [];
foreach ($array as $k => $v) {
if (!isset($swaps[$k], $array[$swaps[$k]])) {
$result[$k] = $v;
} else {
$result[$swaps[$k]] = $array[$swaps[$k]];
}
}
var_export($result);
输出:
array (
'd' => 'val4',
'b' => 'val2',
'c' => 'val3',
'a' => 'val1',
'e' => 'val5',
)
扩展名:
$swaps = ['a' => 'd', 'd' => 'a', 'b' => 'e', 'e' => 'b'];
使:
array (
'd' => 'val4',
'e' => 'val5',
'c' => 'val3',
'a' => 'val1',
'b' => 'val2',
)
$swaps = ['a' => 'c', 'c' => 'e', 'e' => 'a'];
使:
array (
'c' => 'val3',
'b' => 'val2',
'e' => 'val5',
'd' => 'val4',
'a' => 'val1',
)
你不能将每个值存储到一个变量中吗?
$val1 = $array[0];
$val2 = $array[3];
$array[0] = $val2;
$array[3] = $val1;
我已经有两个月了同样的问题..但是在javascript中..经过大量搜索和我的旧方法不幸的是不正确。(我发现)我在这里更新答案。(我用不同的方法测试了几次数组大小)
我的旧代码:
$array = array('name' => 'mostafa', 'family' => 'mason', 'phone' => '524854745', 'sid' => '85487452660');
// Swap keys 'name' and 'sid'
list($array['name'], $array['sid']) = array($array['sid'], $array['name']);
// Swap keys 'family' and 'phone'
list($array['family'], $array['phone']) = array($array['phone'], $array['family']);
var_dump($array);
更新:我认为我自己这里存在一些误解..是的,这不是已接受的答案中提到的
array_flip()
的正确结果。所以在这里我对一个答案的更新,但我认为最好使用 $array[$key2]
和 $array[$key1]
而不是仅仅使用 $value1
或 $value2
并且我还添加了一些数组检查。
function arr_change($array, $key1, $key2) {
if (array_key_exists($key1, $array) && array_key_exists($key2, $array)) {
$myarr = [];
foreach ($array as $key => $value) {
if ($key === $key1) {
$myarr[$key2] = $array[$key2];
} elseif ($key === $key2) {
$myarr[$key1] = $array[$key1];
} else {
$myarr[$key] = $value;
}
}
return $myarr;
}
return $array;
}
$array = array('a' => 'val1', 'b' => 'val2', 'c' => 'val3', 'd' => 'val4');
print_r($array);
$array = arr_change($array, 'a', 'd');
echo "<br/>";
print_r($array);