是否有用于交换两个变量值的PHP函数?

时间:2010-08-22 13:58:19

标签: php function swap

比如我说......

$var1 = "ABC"
$var2 = 123

在某些情况下,我想像这样交换两个......

$var1 = 123
$var2 = "ABC"

是否有用于执行此操作的PHP函数,而不是必须创建第三个变量来保存其中一个值,然后重新定义每个值,如此...

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

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

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

19 个答案:

答案 0 :(得分:98)

TL; DR

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

摘要

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

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()仅适用于数字!

答案 1 :(得分:78)

我知道没有任何功能,但有Pete Graham的单行礼貌:

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

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

另外,正如@Paul Dixon指出的那样,它不是非常有效,而且比使用临时变量更昂贵。可能需要注意一个非常大的循环。

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

答案 2 :(得分:27)

是的,现在有类似的东西。它不是一个函数,而是一个语言结构(自PHP 7.1起可用)。它允许这种简短的语法:

 [$a, $b] = [$b, $a];

有关详细信息,请参阅"Square bracket syntax for array destructuring assignment"

答案 3 :(得分:16)

也可以使用旧的XOR技巧(但它只适用于整数,并且它不会使代码更容易阅读..)

$a ^= $b ^= $a ^= $b;

答案 4 :(得分:9)

是的,请尝试this

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

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

这让我想起了python,这样的语法完全有效:

a, b = b, a

遗憾的是,你不能在PHP中执行上述操作......

答案 5 :(得分:7)

另一种方式:

$a = $b + $a - ($b = $a);

答案 6 :(得分:6)

对于数字:

$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 SWAPPED!)

答案 7 :(得分:4)

list($var1,$var2) = array($var2,$var1);

答案 8 :(得分: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

答案 9 :(得分:4)

另一种简单的方法

$a=122;
$b=343;

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

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

答案 10 :(得分:2)

感谢您的帮助。我把它变成了PHP函数swap()

function swap(&$var1, &$var2) {
    $tmp = $var1;
    $var1 = $var2;
    $var2 = $tmp;
}

代码示例可在以下位置找到:

http://liljosh.com/swap-php-variables/

答案 11 :(得分: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);

答案 12 :(得分:2)

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

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

答案 13 :(得分:1)

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

parse_str()

DEMO

答案 14 :(得分:1)

如果两个变量都是整数,则可以使用数学方法:

$a = 7; $b = 10; $a = $a + $b; $b = $a - $b; $a = $a - $b;

好博客帖子 - http://booleandreams.wordpress.com/2008/07/30/how-to-swap-values-of-two-variables-without-using-a-third-variable/

答案 15 :(得分:-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;

答案 16 :(得分:-2)

<?php

swap(50, 100);

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

答案 17 :(得分:-3)

另一个答案

$a = $a*$b;
$b = $a/$b;
$a = $a/$b;

答案 18 :(得分:-10)

$a=5; $b=10; $a=($a+$b)-$a; $b=($a+$b)-$b;