Is there a PHP function for swapping the values of

2019-01-07 06:10发布

问题:

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;