Is there a PHP function for swapping the values of two variables?

PhpFunctionSwap

Php Problem Overview


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.

Php Solutions


Solution 1 - Php

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() and swap4() are 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!

Solution 2 - Php

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 - Php

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 - Php

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 - Php

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...

Solution 6 - Php

Another way:

$a = $b + $a - ($b = $a);

Solution 7 - Php

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!)

Solution 8 - Php

list($var1,$var2) = array($var2,$var1);

Solution 9 - Php

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

Solution 10 - Php

another simple method

$a=122;
$b=343;

extract(array('a'=>$b,'b'=>$a));

echo '$a='.$a.PHP_EOL;
echo '$b='.$b;

Solution 11 - Php

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;
    ?>

Solution 12 - Php

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/

Solution 13 - Php

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);

Solution 14 - Php

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

Solution 15 - Php

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/

Solution 16 - Php

$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;

Solution 17 - Php

<?php

swap(50, 100);

function swap($a, $b) 
{
   $a = $a+$b;
   $b = $a - $b;
   $a = $a - $b;
   echo "A:". $a;
   echo "B:". $b;
 }
?>

Solution 18 - Php

another answer

$a = $a*$b;
$b = $a/$b;
$a = $a/$b;

Solution 19 - Php

$a=5; $b=10; $a=($a+$b)-$a; $b=($a+$b)-$b;

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTaylorView Question on Stackoverflow
Solution 1 - PhpevilReikoView Answer on Stackoverflow
Solution 2 - PhpPekkaView Answer on Stackoverflow
Solution 3 - PhpPawel DubielView Answer on Stackoverflow
Solution 4 - PhpPawel DubielView Answer on Stackoverflow
Solution 5 - PhpJustin EthierView Answer on Stackoverflow
Solution 6 - PhpPrasanthView Answer on Stackoverflow
Solution 7 - PhpNaga Krishna Teja KommaView Answer on Stackoverflow
Solution 8 - PhpThomas ClaysonView Answer on Stackoverflow
Solution 9 - PhpRon van der HeijdenView Answer on Stackoverflow
Solution 10 - Phpuser2907171View Answer on Stackoverflow
Solution 11 - PhpGaurang PView Answer on Stackoverflow
Solution 12 - PhpJosh LaMarView Answer on Stackoverflow
Solution 13 - PhpDani-BrView Answer on Stackoverflow
Solution 14 - PhpVidhyut PandyaView Answer on Stackoverflow
Solution 15 - PhpJanis JanovskisView Answer on Stackoverflow
Solution 16 - PhpBhavin ThummarView Answer on Stackoverflow
Solution 17 - PhpSham HaramalkarView Answer on Stackoverflow
Solution 18 - PhpshaggyView Answer on Stackoverflow
Solution 19 - PhpmizanrobiView Answer on Stackoverflow