交换数组中的两个键/值对

时间:2011-12-22 15:08:18

标签: php

我有一个数组:

$array = array('a' => 'val1', 'b' => 'val2', 'c' => 'val3', 'd' => 'val4');

如何交换任意两个键,以便数组的顺序不同?例如。生成这个数组:

$array = array('d' => 'val4', 'b' => 'val2', 'c' => 'val3', 'a' => 'val1');

谢谢:)。

6 个答案:

答案 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(),所以我希望我能正确理解。

演示:http://codepad.org/eTok9WA6

答案 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);
}

演示:http://ideone.com/7gWKO

答案 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_keysarray_valuesarray_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;
}