Gibt es eine PHP-Funktion zum Vertauschen der Werte zweier Variablen?


77

Sagen Sie zum Beispiel, ich habe ...

$var1 = "ABC"
$var2 = 123

und unter bestimmten Bedingungen möchte ich die beiden so austauschen ...

$var1 = 123
$var2 = "ABC"

Gibt es eine PHP-Funktion, um dies zu tun, anstatt eine dritte Variable erstellen zu müssen, um einen der Werte zu halten, und dann jeden neu zu definieren, wie so ...

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

Für solch eine 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. Sie haben sich nur gefragt, ob so etwas existiert?

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


4
Sie können auch verwenden , xor, wie ... b = a xor b, a = a xor b, b = a xor bsollte es tun ... Keine Ahnung , ob noch eine Funktion, ich bin mit PHP nicht gut.
Alternative

3
Diese Antworten ähneln einer Art Verschleierungswettbewerb.
Gherman

Antworten:


109

TL; DR

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

Zusammenfassung

Wie viele erwähnt haben, gibt es mehrere Möglichkeiten, dies zu tun. Am auffälligsten sind diese 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 ungefähren Durchschnitt von 0,19 Sekunden.
  • swap2()= erzielte einen ungefähren Durchschnitt von 0,42 Sekunden.
  • swap3()= erzielte einen ungefähren Durchschnitt von 0,16 Sekunden. Gewinner!
  • swap4()= erzielte ungefähren Durchschnitt von 0,73 Sekunden.

Und für die Lesbarkeit finde ich swap3()besser als die anderen Funktionen.

Hinweis

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

3
Die Antwort auf diese Frage wurde geändert, da die Frage anscheinend viel Aufmerksamkeit erhält und Sie sie auf einer Bank markiert haben. swap3 ist im Grunde die gleiche wie die ursprüngliche Frage, die in Funktion eingepackt ist. Beweisen Sie, dass Einfachheit oft besser ist, auch wenn es zusätzliche Zeilen bedeutet!
Taylor

2
Ja, ich stimme auch Ihrer Zusammenfassung zu. Aber Sie können entfernen swap1, es macht einige echte Scheiße.
Alain Tiemblo

1
Swap2 ist eindeutig am besten für die Lesbarkeit / Schreibbarkeit. Swap1 ist nur anmaßend und Swap3 ist der "nicht tauschende" Weg, dies zu tun. Natürlich ist jede Option in Ordnung, wenn Sie eine eigene Wrapper-Funktion swap(&$a,&$b)erstellen , die wie gewünscht funktioniert .
Deji

Swap1 war perfekt für mich, da ich nur Bytes tauschen wollte, wenn eines größer als das andere war
Steve Byrne

1
Das, was es wert ist, swap2()kann jetzt gemäß der Antwort von @Pawel Dubiel unten umgeschrieben werden und ist viel schneller als zu dem Zeitpunkt, als diese Benchmarks geschrieben wurden. Ich habe einige eigene Benchmarks durchgeführt und über 1 Million Iterationen dauerte es nur 0,01 Sekunden länger, swap3()was natürlich vernachlässigbar ist. Auch [$a, $b] = [$b, $a];sieht gut aus .
Billynoah

86

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

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

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

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

Eine Situation, in der dies notwendig ist, riecht für mich sowieso etwas falsch. Wenn Sie darüber diskutieren möchten: Wofür benötigen Sie das?


3
+1 - fand das gleiche und stimme zu, nicht sicher, ob es mir auch gefällt - die Verwendung einer temporären Variablen ist erheblich besser - ebenso wie das Schreiben einer eigenen Swap-Methode, wenn Sie dies häufig tun.
Will A

+1, schlagen Sie mich auch :) Ich mag die Idee im Prinzip, aber leider hinterlässt die PHP-Syntax nur einen schlechten Geschmack ...
Justin Ethier

Wow, super schnelle Antwort. Ich nehme euch allen den Hut ab! ist ein netter kleiner Trick, der.
Taylor

28
Da dies die akzeptierte Antwort auf eine Frage ist, die andere aufklären könnte, sollte darauf hingewiesen werden, wie ineffizient dies ist. Sie fordern PHP auf, ein Array zu erstellen, um es dann sofort zu verwerfen. Ich habe diesen Ansatz mit der Verwendung einer temporären Variablen verglichen und festgestellt, dass die Verwendung einer temporären Variablen mehr als siebenmal schneller ist. Ich würde auch argumentieren, dass es die Absicht auch klarer macht, da es eine verbreitete Redewendung ist!
Paul Dixon

2
Und da dieser Antwortende skeptisch ist, iteriert Google bei der Frage, ob PHP integriert swap()ist, durch ein Array, in dem die Schlüssel Werte enthalten - z. B. geben sie Spalten in einer Datenbank an, und die Werte geben Werte an. Wenn es jedoch kein Paar gibt, sondern nur einen Wert, können Sie den Wert als Schlüssel (Swap) verwenden und einen Standardwert verwenden. Da in meinem Beispiel brauche ich nicht den Schlüssel zu halten, ist es nicht wirklich wichtig, aber wenn ich brauchte den Array - Index zu halten, würde ich eher einen (Bult-in) verwendet swap()Aufruf als temporäre ein blöden Namen zu schaffen. Aber das ist nicht eingebaut ...
Deji


16

Es ist auch möglich, den alten XOR-Trick zu verwenden (funktioniert jedoch nur für Ganzzahlen korrekt und erleichtert das Lesen von Code nicht.)

$a ^= $b ^= $a ^= $b;

2
Wenn Sie es mit Wörtern verwenden, die dieselben Teile enthalten, wird ein lustiges und unerwartetes Ergebnis zurückgegeben: ideone.com/NGQVYH
Ilia Rostovtsev

9

Ja, versuchen Sie Folgendes :

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

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

Dies erinnert mich an Python, wo eine solche Syntax vollkommen gültig ist:

a, b = b, a

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



7

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


Dies funktioniert nur für Zahlen und ist keine eingebaute PHP-Funktion. Das OP forderte einen allgemeineren Ansatz und eine vordefinierte Funktion.
Keenthinker

Sie haben Recht, haben es verpasst, sich alle anderen Antworten und Implementierungen anzusehen.
Naga Krishna Teja Komma

Obwohl die Antwort speziell für die gestellte Frage nicht korrekt ist, bin ich froh, dass jemand diesen Ansatz erwähnt hat, also stimme mir zu :)
Arman P.


4

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


1
Ein Hinweis an alle: Diese Funktion funktioniert nur in allen Fällen , wenn $aund $bdie gleiche Länge hat, wie pro @ M13R
ELEKTRA

4

eine andere einfache Methode

$a=122;
$b=343;

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

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

2

Hier ist ein anderer Weg, ohne eine Temperatur oder eine dritte Variable zu verwenden.

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

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

echo $a . $b;
?>

Und wenn Sie es zu einer Funktion machen wollen:

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

3 Optionen:

$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 nicht mit allen Arten von Variablen funktioniert. (Beispiel: funktioniert nur für Zeichenfolgen mit derselben Länge)
Diese Methode ist aus jedem Blickwinkel 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);

Es funktioniert (wenn sie die gleiche Länge haben). Jetzt getestet, auf PHP5.5
Dani-Br

Code: Funktionstausch (& $ x, & $ y) {$ x ^ = $ y ^ = $ x ^ = $ y;} $ a = "aaa"; $ b = "bbb"; Swap ($ a, $ b); Echo $ a, $ b;
Dani-Br

1

Ja, ich weiß, dass es viele Lösungen gibt, aber hier ist eine andere. Sie können auch die parse_str()Funktion 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


Warum zum Teufel würdest du das tun ... und was ist mit dem Fall, wenn $ b so etwas enthält b&a=abc?
Jirigracik


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

-2
<?php

swap(50, 100);

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

1
Während Antworten immer geschätzt werden, wurde diese Frage vor 6 Jahren gestellt und hatte bereits eine akzeptierte Lösung. Bitte versuchen Sie zu vermeiden, dass Fragen nach oben stoßen, indem Sie Antworten darauf geben, es sei denn, die Frage wurde nicht bereits als gelöst markiert oder Sie haben eine neue und verbesserte Lösung für das Problem gefunden. Denken Sie auch daran, einen Kontext für Ihren Code anzugeben, um ihn zu erklären. In der Dokumentation zum Schreiben großartiger Antworten finden Sie einige Tipps, wie Sie Ihre Antworten zählen lassen können :)
Obsidian Age

-3

eine andere Antwort

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

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

3
Dies funktioniert nicht, sowohl a als auch b wären 10. (10 + 10) -10 = 10
Gabe Sechan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.