Скажем, например, у меня есть …
$var1 = "ABC" $var2 = 123
и при определенных условиях я хочу поменять их вокруг так …
$var1 = 123 $var2 = "ABC"
Есть ли функция PHP для этого, вместо того, чтобы создавать третью переменную, чтобы удерживать одно из значений, а затем переопределять их, например …
$var3 = $var1 $var1 = $var2 $var2 = $var3
Для такой простой задачи, вероятно, быстрее использовать третью переменную, и я всегда мог бы создать свою собственную функцию, если бы захотел. Просто интересно, существует ли что-то подобное?
Обновление. Использование 3-ей переменной или ее упаковка в функции – лучшее решение. Это чисто и просто. Я задал вопрос больше из любопытства, и выбранный ответ был своего рода «лучшей альтернативой». Просто используйте третью переменную.
Не существует встроенной функции.
Как уже упоминалось, существует 3 метода:
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; }
Я протестировал 3 метода под циклом из 1000 итераций, чтобы найти самый быстрый из них:
И для удобочитаемости / возможности записи, IMO я считаю, что swap3 лучше, чем другие 2 функции.
ОБНОВЛЕНИЕ 2017:
Нет никакой функции, о которой я знаю, но есть один лайнер любезности Пете Грэма :
list($a,$b) = array($b,$a);
не уверен, нравится ли мне это с точки зрения обслуживания, хотя на самом деле это неинтуитивно понятно.
Кроме того, как указывает @Paul Dixon, он не очень эффективен и дороже, чем использование временной переменной. Возможно, заметьте в очень большой петле.
Однако ситуация, когда это необходимо, немного пахнет мне. Если вы хотите обсудить это: для чего вам это нужно?
Также можно использовать старый трюк XOR (однако он работает корректно только для целых чисел, и он не делает код более удобным для чтения ..)
$a ^= $b ^= $a ^= $b;
Да, теперь существует нечто подобное. Это не функция, а языковая конструкция (доступная с PHP 7.1). Он позволяет использовать этот короткий синтаксис:
[$a, $b] = [$b, $a];
Подробнее см. «Синтаксис квадратной скобки для назначения деструкции массива» .
Да, попробуйте это :
// Test variables $a = "content a"; $b = "content b"; // Swap $a and $b list($a, $b) = array($b, $a);
Это напоминает мне python, где синтаксис, подобный этому, совершенно правдоподобен:
a, b = b, a
Это позор, который вы не можете просто сделать выше в PHP …
Другой путь:
$a = $b + $a - ($b = $a);
list($var1,$var2) = array($var2,$var1);
Это быстрее и требует меньшей памяти.
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
Рабочий пример: http://codepad.viper-7.com/ytAIR4
Для чисел:
$a = $a+$b; $b = $a-$b; $a = $a-$b;
За работой:
Пусть $ a = 10, $ b = 20.
$ a = $ a + $ b (теперь $ a = 30, $ b = 20)
$ b = $ a- $ b (теперь $ a = 30, $ b = 10)
$ a = $ a- $ b (теперь, $ a = 20, $ b = 10 SWAPPED!)
Вот еще один способ, не используя временную или третью переменную.
<?php $a = "One - 1"; $b = "Two - 2"; list($b, $a) = array($a, $b); echo $a . $b; ?>
И если вы хотите сделать его функцией:
<?php function swapValues(&$a, &$b) { list($b, $a) = array($a, $b); } $a = 10; $b = 20; swapValues($a, $b); echo $a; echo '<br>'; echo $b; ?>
Спасибо за помощь. Я сделал это в PHP-функции swap ()
function swap(&$var1, &$var2) { $tmp = $var1; $var1 = $var2; $var2 = $tmp; }
Пример кода можно найти по адресу:
3 варианта:
$x ^= $y ^= $x ^= $y; //bitwise operators
или:
list($x,$y) = array($y,$x);
или:
$tmp=$x; $x=$y; $y=$tmp;
Я думаю, что первый вариант является самым быстрым и требует меньшей памяти, но он не работает хорошо со всеми типами переменных. (пример: работает только для строк с одинаковой длиной)
Во всяком случае, этот метод намного лучше, чем метод арифметики, под любым углом.
(Арифметика: {$ a = ($ a + $ b) – $ a; $ b = ($ a + $ b) – $ b;} проблема MaxInt и многое другое …)
Функции, например:
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);
еще один простой метод
$a=122; $b=343; extract(array('a'=>$b,'b'=>$a)); echo '$a='.$a.PHP_EOL; echo '$b='.$b;
Да, я знаю, что есть много доступных решений, но вот еще один. Вы можете также использовать parse_str()
. Справочная функция 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; ?>
DEMO
Если обе переменные являются целыми числами, вы можете использовать математический подход:
$a = 7; $b = 10; $a = $a + $b; $b = $a - $b; $a = $a - $b;
Хорошее сообщение в блоге – http://booleandreams.wordpress.com/2008/07/30/how-to-swap-values-of-two-variables-without-using-a-third-variable/
<?php swap(50, 100); function swap($a, $b) { $a = $a+$b; $b = $a - $b; $a = $a - $b; echo "A:". $a; echo "B:". $b; } ?>
$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;
другой ответ
$a = $a*$b; $b = $a/$b; $a = $a/$b;
$a=5; $b=10; $a=($a+$b)-$a; $b=($a+$b)-$b;