Is there a PHP function for swapping the values of two variables?
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.
Solution 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!
Solution 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?
Solution 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.
Solution 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;
Solution 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...