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. J开发者_如何学Pythonust 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.
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!
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?
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.
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;
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...
Another way:
$a = $b + $a - ($b = $a);
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!)
list($var1,$var2) = array($var2,$var1);
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
another simple method
$a=122;
$b=343;
extract(array('a'=>$b,'b'=>$a));
echo '$a='.$a.PHP_EOL;
echo '$b='.$b;
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;
?>
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/
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);
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/
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
$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;
I checked all solutions after that i came up with another solution that was not found anywhere. my logic is simple. i used PHP variable ref. pattern. means $$. you can read more about this by this link https://www.php.net/manual/en/language.variables.variable.php
$a =12;$b="ABC";
$$a =$b;
$$b= $$a.$a;
echo " a = $a and b=$b <br>now after reverse.<br>";
echo $$b;
//output : abc12
<?php
swap(50, 100);
function swap($a, $b)
{
$a = $a+$b;
$b = $a - $b;
$a = $a - $b;
echo "A:". $a;
echo "B:". $b;
}
?>
another answer
$a = $a*$b;
$b = $a/$b;
$a = $a/$b;
$a=5; $b=10; $a=($a+$b)-$a; $b=($a+$b)-$b;
精彩评论