使用PHP交换数组值

34

我有一个数组:

array(
    0 => 'contact',
    1 => 'home',
    2 => 'projects'
);

我需要将“contact”和“home”交换位置,使得数组看起来像这样:

array(
    0 => 'home',
    1 => 'contact',
    2 => 'projects'
);

我该如何使用PHP实现这个功能? :)


1
你不能只使用一个临时变量来进行交换吗? - j08691
1
如果您需要对数组进行排序,您需要定义明确的排序标准。 - jeroen
4
也许更好的问题是:为什么它一开始就无序了? - Wesley Murch
10个回答

53

我写了一个简单的函数array_swap:交换swap_aswap_b两个位置之间的元素。

function array_swap(&$array,$swap_a,$swap_b){
   list($array[$swap_a],$array[$swap_b]) = array($array[$swap_b],$array[$swap_a]);
}

对于OP的问题(例如):

$items = array(
  0 => 'contact',
  1 => 'home',
  2 => 'projects'
);

array_swap($items,0,1);
var_dump($items);
// OUTPUT

array(3) {
   [0]=> string(4) "home"
   [1]=> string(7) "contact"
   [2]=> string(8) "projects"
 }

更新 从PHP 7.1开始,可以这样做:

$items = [
  0 => 'contact',
  1 => 'home',
  2 => 'projects'
];

[$items[0], $items[1]] = [$items[1], $items[0]];

var_dump($items);
// OUTPUT

array(3) {
   [0]=> string(4) "home"
   [1]=> string(7) "contact"
   [2]=> string(8) "projects"
 }

通过对称数组解构是可以实现的。


第二种方法也可以使用 list() 完成:list($items[0], $items[1]) = [$items[1], $items[0]];(在 PHP 7.1 之前的版本中支持)。 - glen-84

46

试试这个:

$a = array(
    0 => 'contact',
    1 => 'home',
    2 => 'projects'
);
$temp = $a[0];
$a[0] = $a[1];
$a[1] = $temp;

8
在PHP 7.1+语法中,你可以使用以下代码:
[$Array[$a], $Array[$b]] = [$Array[$b], $Array[$a]];

这个在 PHP 7 中属于什么情况?运行出错,提示syntax error, unexpected '=' - Jordan
7.1,不仅仅是版本7或任何子版本;@Jordan - Brian Leishman
@Jordan http://php.net/manual/zh/migration71.new-features.php#migration71.new-features.symmetric-array-destructuring - Brian Leishman
不是我。 - Jordan

7

在交换另一个值时,只需使用临时变量来保存一个值。然后使用临时变量还原第一个值。对于数字,有其他方法可以不需要使用临时变量,但在这里使用临时变量是最好(唯一?)的方法。

$a = array(
    0 => 'contact',
    1 => 'home',
    2 => 'projects'
);

print_r($a);
Array ( [0] => contact [1] => home [2] => projects )

$tmp = $a[0];
$a[0] = $a[1];
$a[1] = $tmp;

print_r($a);
Array ( [0] => home [1] => contact [2] => projects )

2
为什么 PriestVallon 的回答有更多的赞同和被接受了呢?你的回答比他早五分钟,而且实际上完全相同(这让我担心他抄袭了你的答案)。 - trejder

4

新回答:(正如其他人所表达的)

我在发布时并不知道对称数组解构,但那是一种无功能、一行代码的交换技术——我会整天使用它。

相关博客文章/教程冒泡排序示例实现

代码:(演示

$a = ['contact', 'home', 'projects'];

[$a[0], $a[1]] = [$a[1], $a[0]];

var_export($a);

旧答案:

如果您想避免使用临时数据存储或喜欢一行代码,可以使用array_replace()

array_replace()将根据索引进行调整:

代码:(演示

$a = array(
    0 => 'contact',
    1 => 'home',
    2 => 'projects'
);

var_export(array_replace($a,[$a[1],$a[0]]));

输出:

array (
  0 => 'home',
  1 => 'contact',
  2 => 'projects',
)

除了性能之外,这仅适用于交换具有键0和1的元素的非常特殊的情况。尽管对于想要一个新数组而不是就地交换的用户来说可能是一个诱人的一行代码,但在我看来,更明确的形式,例如array_replace($a, [I => $a[J], J => $a[I]])将更易读且更少出错。 - luciole75w
感谢您提醒我。这个答案并没有反映我的最新建议,所以我已经进行了编辑。谢谢。 - mickmackusa
自从v7.4版本以后,你也可以这样做[$a[1], $a[0]] = $a; :) - SirPilan
这适用于在这种情况下更改前两个元素,但不要尝试对第二个和第三个元素进行相同的操作。 https://3v4l.org/hRbnI @SirPilan - mickmackusa
在这种情况下,您需要在前面添加一个, - 示例。这仅适用于小型数组,所以我理解您的意思。 - SirPilan

3

我测试了提出的四种比较性能的方法:

$array=range(0,9999); //First 10000 natural numbers
$time=-microtime(true); //Start time
for($i=0;$i<1000000;++$i){ //1 Millon swaps
    $a=array_rand($array); //Random position: ~60ms
    $b=array_rand($array); //Random position: ~60ms
    //Using a temp variable: ~70ms
    $temp=$array[$a];$array[$a]=$array[$b];$array[$b]=$temp;
    //Using list language construct: ~ 140ms
    list($array[$a],$array[$b])=array($array[$b],$array[$a]);
    //Using PHP 7.1+ syntax: ~ 140ms
    [$array[$a],$array[$b]]=[$array[$b],$array[$a]];
    //Using array_replace function: ~ 28000ms
    array_replace($array,[$array[$a],$array[$b]]);
}
$time+=microtime(true); //Elapsed time
echo "Time: ",sprintf('%f', $time)," seconds";

尽管可能不是最舒适的方法,但使用临时变量似乎比下面的两种方法快2倍,比使用array_replace函数快400倍


3

只需要使用一个临时变量来保存它。因此:

$temp = $array[0];
$array[0] = $array[1];
$array[1] = $temp;

那样做,您就不会失去它们中的任何一个的价值。

2
$array = array(
    0 => 'home',
    1 => 'contact',
    2 => 'projects'
);

$t = $array[0];
$array[0] = $array[1];
$array[1] = $t;

这是一个相对简单的方法...

1

解决方案:

$a = array(
    0 => 'contact',
    1 => 'home',
    2 => 'projects'
);

list($a[0], $a[1]) = [$a[1], $a[0]];

我已经为此编写了函数

function swap(&$a, &$b){
    list($a, $b) = [$b, $a];
}

用法:

swap($a[0], $a[1]);


1
$x = array('a', 'b', 'c', 'd');
array_splice($x, 1, 2, array_reverse(array_slice($x, 1, 2)));
var_dump($x);

array_splice可以替换一个反转的array_slice


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接