交换由键指定的两个关联数组元素的位置

问题描述 投票:0回答:8

我有一个数组:

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

如何通过键交换任意两个元素(例如

a
d
)以生成此数组:

$array = array(
    'd' => 'val4',
    'b' => 'val2',
    'c' => 'val3',
    'a' => 'val1'
);
php arrays associative-array swap
8个回答
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


2
投票

最佳 一种方法是创建键和值的数组。 交换两个数组中的位置,然后将它们放回一起。

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


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


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;
}

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;
}

0
投票

将键交换声明为自反关联数组。 然后将映射的数据推入结果数组中。如果在交换数组中找不到,则在遍历输入数组时将元素直接转移到结果数组。

这个过程可以容纳多对交换甚至链式交换。 请注意,在交换数组中,“值”是要移动的元素的键,“键”是基于原始键位置的目的地。 演示

$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',
)

-1
投票

你不能将每个值存储到一个变量中吗?

$val1 = $array[0];
$val2 = $array[3];
$array[0] = $val2;
$array[3] = $val1;

-1
投票

我已经有两个月了同样的问题..但是在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);
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.