是否有PHP函数可以交换两个变量的值?


77

比如说我有...

$var1 = "ABC"
$var2 = 123

在某些条件下,我想像这样交换两个...

$var1 = 123
$var2 = "ABC"

有没有这样做的PHP函数,而不必创建第3个变量来保存其中一个值,然后重新定义每个值,就像这样...

$var3 = $var1
$var1 = $var2
$var2 = $var3

对于这样一个简单的任务,无论如何使用3rd变量可能更快,如果我真的愿意的话,我总是可以创建自己的函数。只是想知道是否存在类似的东西?

更新:使用第三个变量或将其包装在函数中是最佳解决方案。干净简单。我出于好奇而问了更多问题,选择的答案是“下一个最佳选择”。只需使用第三个变量。


4
您可以使用XOR太像...... b = a xor ba = a xor bb = a xor b应该做的伎俩......说不上来,如果那里有一个功能,我不擅长用PHP。
替代

3
这些答案类似于某种混淆竞赛。
Gherman 2014年

Answers:


109

TL; DR

没有内置功能。swap3()如下所述使用。

概要

正如许多人提到的,有多种方法可以做到这一点,最值得注意的是以下四种方法:

function swap1(&$x, &$y) {
    // Warning: works correctly with numbers ONLY!
    $x ^= $y ^= $x ^= $y;
}
function swap2(&$x, &$y) {
    list($x,$y) = array($y, $x);
}
function swap3(&$x, &$y) {
    $tmp=$x;
    $x=$y;
    $y=$tmp;
}
function swap4(&$x, &$y) {
    extract(array('x' => $y, 'y' => $x));
}

我在1000次迭代的for循环下测试了这4种方法,以找出其中最快的一种:

  • swap1()=得分约为0.19秒的平均值。
  • swap2()=得分约为0.42秒的平均值。
  • swap3()=得分约为0.16秒的平均值。优胜者!
  • swap4()=得分约为0.73秒的平均值。

而且为了可读性,我发现swap3()它比其他功能要好。

注意

  • swap2()并且swap4()由于函数调用而总是比其他方法慢。
  • swap1()swap3()两者的性能速度非常相似,但是大多数时候swap3()速度略快。
  • 警告: swap1()仅适用于数字!

3
更改了此答案,因为该问题似乎引起了广泛关注,并且您已经对它们进行了评分。swap3与包含在函数中的原始问题基本相同。证明简单性通常更好,即使这意味着额外的行数也是如此!
泰勒

2
是的,我也支持您的摘要。但是您可以删除swap1它,它确实会产生一些废话。
Alain Tiemblo 2015年

1
Swap2显然最适合可读性/可写性。Swap1只是自以为是,而Swap3是“非交换”方式。显然,如果您使自己的包装器功能按需要工作,那么任何选择都是可以的,这swap(&$a,&$b)可能会很有用。
德吉

Swap1对我而言是完美的,因为我想要的就是交换一个字节(如果一个字节大于另一个字节)
Steve Byrne

1
因为swap2()现在可以按照下面的@Pawel Dubiel的答案重写它的价值,并且比编写这些基准时快得多。我自己运行了一些基准测试,经过一百万次迭代,只花了0.01秒的时间,swap3()这当然可以忽略不计。另外,[$a, $b] = [$b, $a];看起来很棒。
billynoah

86

我不知道有什么功能,但是有Pete Graham的一口气

list($a,$b) = array($b,$a);

但从维护的角度来看,我不确定我是否喜欢它,因为理解起来并不是很直观。

而且,正如@Paul Dixon指出的那样,它不是非常有效,并且比使用临时变量要昂贵。可能在很大的循环中值得注意。

但是,无论如何,这种情况在我看来有点不对劲。如果您想讨论它:您需要什么?


3
+1-发现相同,并同意,也不确定我是否也喜欢-使用temp变量要好得多-如果您发现自己经常这样做,则编写自己的swap方法也是如此。
将在

+1,也击败我:)我原则上喜欢这个主意,但是不幸的是,PHP语法只留下了不好的味道……
Justin Ethier

哇,超快速反应。我向所有人致敬!这是一个很好的小技巧。
泰勒

28
因为这是一个可以教育他人的问题的公认答案,所以有必要指出这是多么低效。您要让PHP创建一个数组,而只是立即丢弃它。我对使用临时变量进行了基准测试,发现使用临时变量的速度快了7倍。我也认为这也使意图更清晰,因为这是一个常见的成语!
保罗·迪克森

2
而且由于此回答者是怀疑的,因此使我成为Google的是PHP是否具有内置swap()函数正在遍历键保存值的数组-例如,它们表示数据库中的列,而值表示值。但是,如果没有一对,只有一个值,那么您可以选择将该值用作键(交换)并使用默认值。因为在我的例子中,我不需要保留的关键,它不是真正必需的,但如果我需要保持数组的索引,我宁愿使用一个(bult式)swap()比创建一个愚蠢命名的临时调用。但是,这不是内置的...
Deji 2016年



9

是的,试试这个

// Test variables
$a = "content a";
$b = "content b";

// Swap $a and $b
list($a, $b) = array($b, $a);

这让我想起了python,其中的语法非常有效:

a, b = b, a

很遗憾您不能只使用PHP执行上述操作...



7

对于数字:

$a = $a+$b;
$b = $a-$b;
$a = $a-$b;

加工:

设$ a = 10,$ b = 20。

$ a = $ a + $ b(现在$ a = 30,$ b = 20)

$ b = $ a- $ b(现在,$ a = 30,$ b = 10)

$ a = $ a- $ b(现在$ a = 20,$ b = 10交换!)


这仅适用于数字,而不是内置的PHP函数。OP要求使用更通用的方法和预定义的功能。
keenthinker 2013年

您是正确的,错过了所有其他答案和实现,就错过了它。
师那Teja Komma

尽管对于所问的问题,答案并不正确,但我很高兴有人提到了这种方法,所以请让我投票:)
Arman P.


4

这个更快,需要更少的内存。

function swap(&$a, &$b) {
    $a = $a ^ $b;
    $b = $a ^ $b;
    $a = $a ^ $b;
}

$a = "One - 1";
$b = "Two - 2";

echo $a . $b; // One - 1Two - 2

swap($a, $b);

echo $a . $b; // Two - 2One - 1

工作示例:http : //codepad.viper-7.com/ytAIR4


1
所有人注意:根据@ m13r –Élektra$a$b
2007年

4

另一个简单的方法

$a=122;
$b=343;

extract(array('a'=>$b,'b'=>$a));

echo '$a='.$a.PHP_EOL;
echo '$b='.$b;

2

这是不使用temp或第三个变量的另一种方法。

<?php
$a = "One - 1";
$b = "Two - 2";

list($b, $a) = array($a, $b);

echo $a . $b;
?>

如果要使其功能:

    <?php
    function swapValues(&$a, &$b) {
         list($b, $a) = array($a, $b);
     }
    $a = 10;
    $b = 20;
    swapValues($a, $b);

    echo $a;
    echo '<br>';
    echo $b;
    ?>


2

3种选择:

$x ^= $y ^= $x ^= $y; //bitwise operators

要么:

list($x,$y) = array($y,$x);

要么:

$tmp=$x; $x=$y; $y=$tmp;

我认为第一种选择是最快的,并且需要较少的内存,但是它不适用于所有类型的变量。(示例:仅适用于长度相同的字符串)
不管怎么说,从任何角度来看,此方法都比算术方法好得多。
(算术:{$ a =($ a + $ b)-$ a; $ b =($ a + $ b)-$ b;} MaxInt问题,以及更多...)

功能例如:

function swap(&$x,&$y) { $x ^= $y ^= $x ^= $y; }
function swap(&$x,&$y) { list($x,$y) = array($y,$x); }
function swap(&$x,&$y) { $tmp=$x; $x=$y; $y=$tmp; }

//usage:
swap($x,$y);

有效(如果它们的长度相同)。目前已在PHP5.5上进行了测试-Dani
-Br

代码:function swap(&$ x,&$ y){$ x ^ = $ y ^ = $ x ^ = $ y;} $ a =“ aaa”; $ b =“ bbb”; swap($ a,$ b); 回显$ a,$ b;
Dani-Br 2015年

1

是的,我知道有很多解决方案可用,但这是另一种解决方案。您也可以使用parse_str()功能。参考W3Schools PHP parse_str()函数

<?php
    $a = 10;
    $b = 'String';

    echo '$a is '.$a;
    echo '....';
    echo '$b is '.$b;

    parse_str("a=$b&b=$a");

    echo '....After Using Parse Str....';

    echo '$a is '.$a;
    echo '....';
    echo '$b is '.$b;

?>

演示


您为什么要这么做……而当$ b包含类似内容时,情况又如何b&a=abc呢?
jirigracik '17


-1
$a = 'ravi';

$b = 'bhavin';

$a = $b.$a;

$b = substr($a,strlen($b),strlen($a));

$a = substr($a,0,strlen($a)-strlen($b));

echo "a=".$a.'<br/>'.'b='.$b;

-2
<?php

swap(50, 100);

function swap($a, $b) 
{
   $a = $a+$b;
   $b = $a - $b;
   $a = $a - $b;
   echo "A:". $a;
   echo "B:". $b;
 }
?>

1
虽然答案总是赞赏,这个问题被问6多年的以前,已经有了一个接受的解决方案。除非尚未将问题标记为已解决,或者找到了新的改进的解决方案,否则请尝试通过向他们提供答案来避免“凸显”问题。还要记住在代码周围提供一些上下文来帮助解释它。查阅有关撰写出色答案的文档,以获取有关如何使您的答案有价值的一些技巧:)
黑曜石时代


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.