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

问题描述 投票:68回答:19

比如我说......

$var1 = "ABC"
$var2 = 123

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

$var1 = 123
$var2 = "ABC"

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

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

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

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

php function swap
19个回答
98
投票

TL;DR

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

Summary

正如许多人提到的,有多种方法可以做到这一点,最明显的是这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()比其他功能更好。

Note

  • 由于函数调用,swap2()swap4()总是比其他的慢。
  • swap1()swap3()两者的表现速度都非常相似,但大部分时间swap3()都略快一些。
  • 警告:swap1()仅适用于数字!

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
投票

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

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

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

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


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

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/


1
投票

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

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

?>

DEMO


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

-3
投票

另一个答案

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

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

80
投票

我不知道有什么功能,但有一个单行礼貌的Pete Graham

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

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

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

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


28
投票

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

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

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


16
投票

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

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

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中完成上述操作......


7
投票

其他方式:

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

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


4
投票
list($var1,$var2) = array($var2,$var1);

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

© www.soinside.com 2019 - 2024. All rights reserved.