web-dev-qa-db-fra.com

Existe-t-il une fonction PHP pour permuter les valeurs de deux variables?

Disons par exemple que j'ai ...

$var1 = "ABC"
$var2 = 123

et sous certaines conditions, je veux échanger les deux comme ça ...

$var1 = 123
$var2 = "ABC"

Existe-t-il une fonction PHP pour ce faire plutôt que d'avoir à créer une 3e variable pour contenir l'une des valeurs puis à redéfinir chacune, comme ça ...

$var3 = $var1
$var1 = $var2
$var2 = $var3

Pour une tâche aussi simple, il est probablement plus rapide d'utiliser une troisième variable de toute façon et je pourrais toujours créer ma propre fonction si je le voulais vraiment. Vous vous demandez simplement si quelque chose comme ça existe?

Mise à jour: L'utilisation d'une 3e variable ou son encapsulation dans une fonction est la meilleure solution. C'est propre et simple. J'ai posé la question plus par curiosité et la réponse choisie était en quelque sorte "la prochaine meilleure alternative". Utilisez simplement une troisième variable.

69
Taylor

TL; DR

Il n'y a pas de fonction intégrée. Utilisez swap3() comme mentionné ci-dessous.

Sommaire

Comme beaucoup l'ont mentionné, il existe plusieurs façons de le faire, les plus notables sont ces 4 méthodes:

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

J'ai testé les 4 méthodes sous une boucle for de 1000 itérations, pour trouver la plus rapide d'entre elles:

  • swap1() = note moyenne approximative de ,19 secondes.
  • swap2() = moyenne approximative de ,42 secondes.
  • swap3() = note moyenne approximative de ,16 secondes. Gagnant!
  • swap4() = note moyenne approximative de ,7 secondes.

Et pour la lisibilité, je trouve que swap3() est meilleure que les autres fonctions.

Remarque

  • swap2() et swap4() sont toujours plus lents que les autres à cause de l'appel de fonction.
  • swap1() et swap3() les deux performances sont très similaires, mais la plupart du temps swap3() est légèrement plus rapide.
  • Attention:swap1() ne fonctionne qu'avec des chiffres!
98
evilReiko

Il n'y a aucune fonction que je connaisse, mais il y a une courtoisie d'une ligne de Pete Graham :

list($a,$b) = array($b,$a);

je ne sais pas si j'aime cela du point de vue de la maintenance, car ce n'est pas vraiment intuitif à comprendre.

De plus, comme le souligne @Paul Dixon, il n'est pas très efficace et est plus coûteux que d'utiliser une variable temporaire. Peut-être à noter dans une très grande boucle.

Cependant, une situation où cela est nécessaire me sent un peu mal, de toute façon. Si vous voulez en discuter: De quoi avez-vous besoin?

80
Pekka 웃

Oui, il existe maintenant quelque chose comme ça. Ce n'est pas une fonction mais une construction de langage (disponible depuis PHP 7.1). Elle permet cette courte syntaxe:

 [$a, $b] = [$b, $a];

Voir "Syntaxe des crochets pour l'affectation de la déstructuration des tableaux" pour plus de détails.

29
Pawel Dubiel

Il est également possible d'utiliser l'ancien XOR (Cependant, il ne fonctionne correctement que pour les entiers et ne facilite pas la lecture du code ..)

$a ^= $b ^= $a ^= $b;
16
Pawel Dubiel

Oui, essayez ceci :

// Test variables
$a = "content a";
$b = "content b";

// Swap $a and $b
list($a, $b) = array($b, $a);

Cela me rappelle python, où une syntaxe comme celle-ci est parfaitement valide:

a, b = b, a

C'est dommage que vous ne puissiez pas simplement faire ce qui précède en PHP ...

9
Justin Ethier

Autrement:

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

Pour les chiffres:

$a = $a+$b;
$b = $a-$b;
$a = $a-$b;

Travail:

Soit $ a = 10, $ b = 20.

$ a = $ a + $ b (maintenant, $ a = 30, $ b = 20)

$ b = $ a- $ b (maintenant, $ a = 30, $ b = 10)

$ a = $ a- $ b (maintenant, $ a = 20, $ b = 10 SWAPPED!)

Celui-ci est plus rapide et nécessite moins de mémoire.

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

Exemple de travail: http://codepad.viper-7.com/ytAIR4

4
Ron van der Heijden

une autre méthode simple

$a=122;
$b=343;

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

echo '$a='.$a.PHP_EOL;
echo '$b='.$b;
4
user2907171
list($var1,$var2) = array($var2,$var1);
4
Thomas Clayson

Merci pour l'aide. Je l'ai transformé en un PHP swap de fonction ()

function swap(&$var1, &$var2) {
    $tmp = $var1;
    $var1 = $var2;
    $var2 = $tmp;
}

Un exemple de code peut être trouvé à:

http://liljosh.com/swap-php-variables/

2
Josh LaMar

Voici une autre façon sans utiliser de temp ou une troisième variable.

<?php
$a = "One - 1";
$b = "Two - 2";

list($b, $a) = array($a, $b);

echo $a . $b;
?>

Et si vous voulez en faire une fonction:

    <?php
    function swapValues(&$a, &$b) {
         list($b, $a) = array($a, $b);
     }
    $a = 10;
    $b = 20;
    swapValues($a, $b);

    echo $a;
    echo '<br>';
    echo $b;
    ?>
2
Gaurang P

3 options:

$x ^= $y ^= $x ^= $y; //bitwise operators

ou:

list($x,$y) = array($y,$x);

ou:

$tmp=$x; $x=$y; $y=$tmp;

Je pense que la première option est la plus rapide et nécessite moins de mémoire, mais elle ne fonctionne pas bien avec tous les types de variables. (exemple: fonctionne bien uniquement pour les cordes de même longueur)
Quoi qu'il en soit, cette méthode est bien meilleure que la méthode arithmétique, sous tous les angles.
(Arithmétique: {$ a = ($ a + $ b) - $ a; $ b = ($ a + $ b) - $ b;} problème de MaxInt, et plus ...)

Fonctions par exemple:

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);
2
Dani-Br

Oui, je sais qu'il existe de nombreuses solutions disponibles, mais en voici une autre. Vous pouvez également utiliser la fonction parse_str(). Référence W3Schools PHP parse_str () .

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

?>

DÉMO

1
Vidhyut Pandya

Si les deux variables sont des nombres entiers, vous pouvez utiliser une approche mathématique:

$a = 7; $b = 10; $a = $a + $b; $b = $a - $b; $a = $a - $b;

Bon article de blog - http://booleandreams.wordpress.com/2008/07/30/how-to-swap-values-of-two-variables-without-using-a-third-variable/ =

1
Janis Janovskis