it-swarm.com.de

Gibt es eine PHP Funktion zum Tauschen der Werte zweier Variablen?

Sagen Sie zum Beispiel, ich habe ...

$var1 = "ABC"
$var2 = 123

und unter bestimmten bedingungen möchte ich die beiden so tauschen ...

$var1 = 123
$var2 = "ABC"

Gibt es eine PHP Funktion, um dies zu tun, anstatt eine dritte Variable erstellen zu müssen, die einen der Werte enthält, und dann jede wie folgt neu definieren ...

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

Für eine so einfache Aufgabe ist es wahrscheinlich sowieso schneller, eine dritte Variable zu verwenden, und ich könnte immer meine eigene Funktion erstellen, wenn ich es wirklich wollte. Nur gefragt, ob so etwas existiert?

Update: Die Verwendung einer dritten Variablen oder das Einschließen einer Funktion ist die beste Lösung. Es ist sauber und einfach. Ich stellte die Frage eher aus Neugier und die gewählte Antwort war eine Art "die nächstbeste Alternative". Verwenden Sie einfach eine dritte Variable.

69
Taylor

TL; DR

Es gibt keine eingebaute Funktion. Verwenden Sie swap3() wie unten erwähnt.

Zusammenfassung

Wie bereits erwähnt, gibt es mehrere Möglichkeiten, dies zu tun. Am auffälligsten sind die folgenden 4 Methoden:

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

Ich habe die 4 Methoden in einer for-Schleife von 1000 Iterationen getestet, um die schnellste zu finden:

  • swap1() = erzielte einen Durchschnittswert von ,19 Sekunden.
  • swap2() = erzielte einen ungefähren Durchschnitt von ,42 Sekunden.
  • swap3() = erzielte einen ungefähren Durchschnitt von ,16 Sekunden. Gewinner!
  • swap4() = erzielte einen ungefähren Durchschnitt von ,7 Sekunden.

Und aus Gründen der Lesbarkeit finde ich, dass swap3() besser ist als die anderen Funktionen.

Hinweis

  • swap2() und swap4() sind aufgrund des Funktionsaufrufs immer langsamer als die anderen.
  • swap1() und swap3() sind beide sehr ähnlich, aber die meiste Zeit ist swap3() etwas schneller.
  • Achtung:swap1() funktioniert nur mit Zahlen!
98
evilReiko

Ich kenne keine Funktion, aber es gibt einen Einzeiler mit freundlicher Genehmigung von Pete Graham :

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

ich bin mir nicht sicher, ob mir das aus Wartungssicht gefällt, da es nicht wirklich intuitiv zu verstehen ist.

Wie @Paul Dixon hervorhebt, ist es außerdem nicht sehr effizient und kostenintensiver als die Verwendung einer temporären Variablen. Möglicherweise bemerkenswert in einer sehr großen Schleife.

Allerdings riecht eine Situation, in der dies notwendig ist, für mich ohnehin etwas falsch. Wenn du darüber diskutieren willst: Wozu brauchst du das?

80
Pekka 웃

Ja, so etwas gibt es jetzt. Es ist keine Funktion, sondern ein Sprachkonstrukt (verfügbar seit PHP 7.1). Es erlaubt diese kurze Syntax:

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

Weitere Informationen finden Sie unter "Syntax in eckigen Klammern für Array-Destrukturierungszuweisungen" .

29
Pawel Dubiel

Es ist auch möglich, den alten XOR Trick zu verwenden. (Er funktioniert jedoch nur für Ganzzahlen und macht den Code nicht einfacher zu lesen.)

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

Ja, versuchen Sie dies :

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

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

Das erinnert mich an Python, wo eine Syntax wie diese vollkommen gültig ist:

a, b = b, a

Es ist eine Schande, dass Sie das nicht einfach in PHP machen können ...

9
Justin Ethier

Ein anderer Weg:

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

Für Zahlen:

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

Arbeiten:

Sei $ a = 10, $ b = 20.

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

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

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

Dieser ist schneller und benötigt weniger Speicher.

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

Arbeitsbeispiel: http://codepad.viper-7.com/ytAIR4

4

eine andere einfache Methode

$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

Danke für die Hilfe. Ich habe daraus eine PHP function swap () gemacht

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

Ein Codebeispiel finden Sie unter:

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

2
Josh LaMar

Hier ist eine andere Möglichkeit ohne Verwendung einer temporären oder einer dritten Variablen.

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

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

echo $a . $b;
?>

nd wenn du es zu einer Funktion machen willst:

    <?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 Möglichkeiten:

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

oder:

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

oder:

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

Ich denke, dass die erste Option die schnellste ist und weniger Speicher benötigt, aber sie funktioniert nicht mit allen Variablentypen. (Beispiel: funktioniert gut nur für Zeichenfolgen mit der gleichen Länge)
Diese Methode ist in jeder Hinsicht viel besser als die arithmetische Methode.
(Arithmetik: {$ a = ($ a + $ b) - $ a; $ b = ($ a + $ b) - $ b;} Problem von MaxInt und mehr ...)

Funktionen zum Beispiel:

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

Ja, ich weiß, dass es viele Lösungen gibt, aber hier ist eine andere. Sie können auch die Funktion parse_str() verwenden. Referenz W3Schools PHP parse_str () - Funktion .

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

1
Vidhyut Pandya

Wenn beide Variablen Ganzzahlen sind, können Sie einen mathematischen Ansatz verwenden:

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

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

1
Janis Janovskis