问题
Say for instance I have ...
$var1 = "ABC"
$var2 = 123
and under certain conditions I want to swap the two around like so...
$var1 = 123
$var2 = "ABC"
Is there a PHP function for doing this rather than having to create a 3rd variable to hold one of the values then redefining each, like so...
$var3 = $var1
$var1 = $var2
$var2 = $var3
For such a simple task its probably quicker using a 3rd variable anyway and I could always create my own function if I really wanted to. Just wondered if something like that exists?
Update: Using a 3rd variable or wrapping it in a function is the best solution. It's clean and simple. I asked the question more out of curiosity and the answer chosen was kind of 'the next best alternative'. Just use a 3rd variable.
回答1:
TL;DR
There isn't a built-in function. Use swap3()
as mentioned below.
Summary
As many mentioned, there are multiple ways to do this, most noticable are these 4 methods:
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));
}
I tested the 4 methods under a for-loop of 1000 iterations, to find the fastest of them:
swap1()
= scored approximate average of 0.19 seconds.swap2()
= scored approximate average of 0.42 seconds.swap3()
= scored approximate average of 0.16 seconds. Winner!swap4()
= scored approximate average of 0.73 seconds.
And for readability, I find swap3()
is better than the other functions.
Note
swap2()
andswap4()
are always slower than the other ones because of the function call.swap1()
andswap3()
both performance speed are very similar, but most of the timeswap3()
is slightly faster.- Warning:
swap1()
works only with numbers!
回答2:
There's no function I know of, but there is a one-liner courtesy of Pete Graham:
list($a,$b) = array($b,$a);
not sure whether I like this from a maintenance perspective, though, as it's not really intuitive to understand.
Also, as @Paul Dixon points out, it is not very efficient, and is costlier than using a temporary variable. Possibly of note in a very big loop.
However, a situation where this is necessary smells a bit wrong to me, anyway. If you want to discuss it: What do you need this for?
回答3:
Yes, there now exists something like that. It's not a function but a language construct (available since PHP 7.1). It allows this short syntax:
[$a, $b] = [$b, $a];
See "Square bracket syntax for array destructuring assignment" for more details.
回答4:
It is also possible to use the old XOR trick ( However it works only correctly for integers, and it doesn't make code easier to read.. )
$a ^= $b ^= $a ^= $b;
回答5:
Yes, try this:
// Test variables
$a = "content a";
$b = "content b";
// Swap $a and $b
list($a, $b) = array($b, $a);
This reminds me of python, where syntax like this is perfectly valid:
a, b = b, a
It's a shame you can't just do the above in PHP...
回答6:
Another way:
$a = $b + $a - ($b = $a);
回答7:
For numbers:
$a = $a+$b;
$b = $a-$b;
$a = $a-$b;
Working:
Let $a = 10, $b = 20.
$a = $a+$b (now, $a = 30, $b = 20)
$b = $a-$b (now, $a = 30, $b = 10)
$a = $a-$b (now, $a = 20, $b = 10 SWAPPED!)
回答8:
list($var1,$var2) = array($var2,$var1);
回答9:
This one is faster and needs lesser memory.
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
Working example: http://codepad.viper-7.com/ytAIR4
回答10:
another simple method
$a=122;
$b=343;
extract(array('a'=>$b,'b'=>$a));
echo '$a='.$a.PHP_EOL;
echo '$b='.$b;
回答11:
Here is another way without using a temp or a third variable.
<?php
$a = "One - 1";
$b = "Two - 2";
list($b, $a) = array($a, $b);
echo $a . $b;
?>
And if you want to make it a function:
<?php
function swapValues(&$a, &$b) {
list($b, $a) = array($a, $b);
}
$a = 10;
$b = 20;
swapValues($a, $b);
echo $a;
echo '<br>';
echo $b;
?>
回答12:
Thanks for the help. I've made this into a PHP function swap()
function swap(&$var1, &$var2) {
$tmp = $var1;
$var1 = $var2;
$var2 = $tmp;
}
Code example can be found at:
http://liljosh.com/swap-php-variables/
回答13:
3 options:
$x ^= $y ^= $x ^= $y; //bitwise operators
or:
list($x,$y) = array($y,$x);
or:
$tmp=$x; $x=$y; $y=$tmp;
I think that the first option is the fastest and needs lesser memory, but it doesn’t works well with all types of variables. (example: works well only for strings with the same length)
Anyway, this method is much better than the arithmetic method, from any angle.
(Arithmetic: {$a=($a+$b)-$a; $b=($a+$b)-$b;} problem of MaxInt, and more...)
Functions for example:
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);
回答14:
If both variables are integers you can use mathematical approach:
$a = 7; $b = 10; $a = $a + $b; $b = $a - $b; $a = $a - $b;
Good blog post - http://booleandreams.wordpress.com/2008/07/30/how-to-swap-values-of-two-variables-without-using-a-third-variable/
回答15:
Yes I know there are lots of solutions available, but here is another one.
You can use parse_str()
function too. Reference 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
回答16:
$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;
回答17:
<?php
swap(50, 100);
function swap($a, $b)
{
$a = $a+$b;
$b = $a - $b;
$a = $a - $b;
echo "A:". $a;
echo "B:". $b;
}
?>
回答18:
another answer
$a = $a*$b;
$b = $a/$b;
$a = $a/$b;
回答19:
$a=5; $b=10; $a=($a+$b)-$a; $b=($a+$b)-$b;
来源:https://stackoverflow.com/questions/3541730/is-there-a-php-function-for-swapping-the-values-of-two-variables