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.
b = a xor b
,a = a xor b
,b = a xor b
sollte es tun ... Keine Ahnung , ob noch eine Funktion, ich bin mit PHP nicht gut.Antworten:
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()
undswap4()
sind aufgrund des Funktionsaufrufs immer langsamer als die anderen.swap1()
undswap3()
beide Leistungsgeschwindigkeiten sind sehr ähnlich, aber die meiste Zeitswap3()
ist etwas schneller.swap1()
funktioniert nur mit Zahlen!quelle
swap1
, es macht einige echte Scheiße.swap(&$a,&$b)
erstellen , die wie gewünscht funktioniert .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 .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?
quelle
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) verwendetswap()
Aufruf als temporäre ein blöden Namen zu schaffen. Aber das ist nicht eingebaut ...Ja, so etwas gibt es jetzt. Es ist keine Funktion, sondern ein Sprachkonstrukt (verfügbar seit PHP 7.1). Es erlaubt diese kurze Syntax:
Weitere Informationen finden Sie unter "Syntax in eckigen Klammern für die Zuweisung von Array-Destrukturierungen" .
quelle
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.)
quelle
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:
Es ist eine Schande, dass Sie in PHP nicht einfach das oben Genannte tun können ...
quelle
Ein anderer Weg:
quelle
Für Zahlen:
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!)
quelle
list($var1,$var2) = array($var2,$var1);
quelle
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
quelle
$a
und$b
die gleiche Länge hat, wie pro @ M13Reine andere einfache Methode
$a=122; $b=343; extract(array('a'=>$b,'b'=>$a)); echo '$a='.$a.PHP_EOL; echo '$b='.$b;
quelle
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; ?>
quelle
Danke für die Hilfe. Ich habe daraus einen PHP-Funktionsaustausch gemacht ()
function swap(&$var1, &$var2) { $tmp = $var1; $var1 = $var2; $var2 = $tmp; }
Codebeispiel finden Sie unter:
http://liljosh.com/swap-php-variables/
quelle
3 Optionen:
$x ^= $y ^= $x ^= $y; //bitwise operators
oder:
list($x,$y) = array($y,$x);
oder:
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);
quelle
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
quelle
b&a=abc
?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 Blog-Beitrag - http://booleandreams.wordpress.com/2008/07/30/how-to-swap-values-of-two-variables-without-using-a-third-variable/
quelle
$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;
quelle
<?php swap(50, 100); function swap($a, $b) { $a = $a+$b; $b = $a - $b; $a = $a - $b; echo "A:". $a; echo "B:". $b; } ?>
quelle
eine andere Antwort
quelle
$a=5; $b=10; $a=($a+$b)-$a; $b=($a+$b)-$b;
quelle