Domanda Esiste una funzione PHP per lo scambio dei valori di due variabili?


Per esempio, ho ...

$var1 = "ABC"
$var2 = 123

e in determinate condizioni voglio scambiare i due in giro così ...

$var1 = 123
$var2 = "ABC"

Esiste una funzione PHP per fare questo invece di dover creare una terza variabile per contenere uno dei valori, quindi ridefinire ciascuno, in questo modo ...

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

Per un compito così semplice è probabilmente più veloce usare comunque una terza variabile e potrei sempre creare la mia funzione se volessi davvero. Mi chiedevo solo se qualcosa del genere esiste?

Aggiornamento: l'utilizzo di una terza variabile o il suo inserimento in una funzione è la soluzione migliore. È pulito e semplice. Ho fatto la domanda più per curiosità e la risposta scelta è stata una sorta di "la migliore alternativa migliore". Basta usare una terza variabile.


62
2017-08-22 13:58


origine


risposte:


Non c'è una funzione integrata.

Come già detto, ci sono 3 metodi per farlo:

function swap1(&$x,&$y) {
    $x ^= $y ^= $x ^= $y;
}
function swap2(&$x,&$y) {
    list($x,$y) = array($y,$x);
}
function swap3(&$x,&$y) {
    $tmp=$x;
    $x=$y;
    $y=$tmp;
}

Ho provato i 3 metodi sotto un ciclo di ripetizioni di 1000 iterazioni, per trovare il più veloce di loro:

  • swap1 = punteggio medio approssimativo di 0,19 secondi.
  • swap2 = punteggio medio approssimativo di 0.42 secondi.
  • swap3 = punteggio medio approssimativo di 0.16 secondi.

E per la leggibilità / scrivibilità, IMO trovo che swap3 è migliore delle altre 2 funzioni.

AGGIORNAMENTO 2017:

  • swap2 è sempre più lento degli altri a causa della chiamata di funzione.
  • swap1 e swap3 entrambe le velocità sono molto simili, ma la maggior parte delle volte swap3 è leggermente più veloce.
  • Avvertimento: swap1 funziona solo con i numeri!

80
2017-10-24 13:37



Non c'è alcuna funzione che io conosca, ma c'è una linea di cortesia di Pete Graham:

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

non sono sicuro che mi piaccia dal punto di vista della manutenzione, anche se non è intuitivo da capire.

Inoltre, come sottolinea @Paul Dixon, non è molto efficiente ed è più costoso dell'utilizzo di una variabile temporanea. Forse di nota in un ciclo molto grande.

Comunque, una situazione in cui questo è necessario mi fa un po 'male, comunque. Se vuoi discuterne: per cosa ti serve?


76
2017-08-22 13:59



È anche possibile usare il vecchio trucco XOR (tuttavia funziona correttamente solo per interi, e non rende il codice più facile da leggere ..)

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

15
2017-07-23 16:22



Sì, ora esiste qualcosa del genere. Non è una funzione ma un costrutto linguistico (disponibile da PHP 7.1). Permette questa breve sintassi:

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

Vedere "Sintassi della parentesi quadra per l'assegnazione destrutturante dell'array" per ulteriori dettagli.


14
2017-09-25 23:37



Sì, prova Questo:

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

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

Questo mi ricorda Python, dove la sintassi come questa è perfettamente valida:

a, b = b, a

È un peccato non si può semplicemente fare quanto sopra in PHP ...


8
2017-08-22 14:00



Un altro modo:

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

5
2017-08-29 07:36



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

4
2017-08-22 14:00



Questo è più veloce e richiede meno memoria.

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

Esempio di lavoro: http://codepad.viper-7.com/ytAIR4


4
2017-07-24 10:34



Per i numeri:

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

Lavoro:

Sia $ a = 10, $ b = 20.

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

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

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


3
2017-10-28 22:40



Ecco un altro modo senza usare una temp o una terza variabile.

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

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

echo $a . $b;
?>

E se vuoi farne una funzione:

    <?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
2017-09-25 06:05