可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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:
There isn't a built-in function.
As many mentioned, there are 3 methods to do this:
function swap1(&$x,&$y) {
$x ^= $y ^= $x ^= $y;
}
function swap2(&$x,&$y) {
list($x,$y) = array($y,$x);
}
function swap3(&$x,&$y) {
$tmp=$x;
$x=$y;
$y=$tmp;
}
I tested the 3 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.
And for readability/writability, IMO I find swap3 is better than the other 2 functions.
UPDATE 2017:
- swap2 is always slower than the other ones because of the function call.
- swap1 and swap3 both performance speed are very similar, but most of the time swap3 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:
list($var1,$var2) = array($var2,$var1);
回答8:
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
回答9:
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!)
回答10:
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;
?>
回答11:
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/
回答12:
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);
回答13:
another simple method
$a=122;
$b=343;
extract(array('a'=>$b,'b'=>$a));
echo '$a='.$a.PHP_EOL;
echo '$b='.$b;
回答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;