Есть ли функция PHP для замены значений двух переменных?
Скажем, например, у меня есть...
$var1 = "ABC"
$var2 = 123
и при определенных условиях я хочу поменять местами два так, как...
$var1 = 123
$var2 = "ABC"
Есть ли функция PHP для этого, а не для создания третьей переменной для хранения одного из значений, а затем переопределения каждого из них, например...
$var3 = $var1
$var1 = $var2
$var2 = $var3
Для такой простой задачи, вероятно, быстрее использовать третью переменную, и я всегда мог бы создать свою собственную функцию, если бы захотел. Просто интересно, существует ли что-то подобное?
Обновление: использование 3-ей переменной или ее упаковка в функции - лучшее решение. Это чисто и просто. Я задал вопрос больше из любопытства, и выбранный ответ был своего рода "лучшей альтернативой". Просто используйте третью переменную.
Ответы
Ответ 1
TL; DR
Там нет встроенной функции. Используйте swap3()
как указано ниже.
Резюме
Как уже упоминалось, есть несколько способов сделать это, наиболее заметными являются следующие 4 метода:
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));
}
Я проверил 4 метода в цикле for из 1000 итераций, чтобы найти самый быстрый из них:
-
swap1()
= набранное приблизительное среднее значение 0,19 секунды. -
swap2()
= набранное приблизительное среднее значение 0,42 секунды. -
swap3()
= набранное приблизительное среднее значение 0,16 секунды. Победитель! -
swap4()
= набранное среднее значение 0,73 секунды.
И для удобства чтения, я считаю, swap3()
лучше, чем другие функции.
Заметка
-
swap2()
и swap4()
всегда медленнее других из-за вызова функции. -
swap3()
swap1()
и swap3()
очень похожа, но в большинстве случаев swap3()
немного быстрее. - Внимание:
swap1()
работает только с числами!
Ответ 2
Нет никакой функции, о которой я знаю, но есть односторонняя любезность Пит Грэхем:
list($a,$b) = array($b,$a);
не уверен, нравится ли мне это с точки зрения обслуживания, хотя это неинтуитивно понятно для понимания.
Кроме того, как указывает @Paul Dixon, он не очень эффективен и дороже, чем использование временной переменной. Возможно, обратите внимание на очень большой цикл.
Однако ситуация, когда это необходимо, немного пахнет мне. Если вы хотите обсудить это: для чего вам это нужно?
Ответ 3
Да, теперь существует нечто подобное. Это не функция, а построение языка (доступно с PHP 7.1). Он позволяет использовать этот короткий синтаксис:
[$a, $b] = [$b, $a];
Подробнее см. "Синтаксис квадратной скобки для назначения деструкции массива" .
Ответ 4
Также можно использовать старый трюк XOR (однако он работает корректно только для целых чисел, и он не делает код более удобным для чтения..)
$a ^= $b ^= $a ^= $b;
Ответ 5
Да, попробуйте this:
// Test variables
$a = "content a";
$b = "content b";
// Swap $a and $b
list($a, $b) = array($b, $a);
Это напоминает мне python, где синтаксис, подобный этому, совершенно верен:
a, b = b, a
Стыдно, что вы не можете просто сделать это в PHP...
Ответ 6
Другой способ:
$a = $b + $a - ($b = $a);
Ответ 7
Для чисел:
$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!)
Ответ 8
list($var1,$var2) = array($var2,$var1);
Ответ 9
Это быстрее и требует меньшей памяти.
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
Ответ 10
другой простой метод
$a=122;
$b=343;
extract(array('a'=>$b,'b'=>$a));
echo '$a='.$a.PHP_EOL;
echo '$b='.$b;
Ответ 11
Вот еще один способ, не используя временную или третью переменную.
<?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;
?>
Ответ 12
Спасибо за помощь. Я сделал это в PHP-функции swap()
function swap(&$var1, &$var2) {
$tmp = $var1;
$var1 = $var2;
$var2 = $tmp;
}
Пример кода можно найти по адресу:
http://liljosh.com/swap-php-variables/
Ответ 13
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);
Ответ 14
Если обе переменные являются целыми числами, вы можете использовать математический подход:
$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/
Ответ 15
Да, я знаю, что есть много доступных решений, но вот еще один.
Вы можете также использовать функцию 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
Ответ 16
$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;
Ответ 17
<?php
swap(50, 100);
function swap($a, $b)
{
$a = $a+$b;
$b = $a - $b;
$a = $a - $b;
echo "A:". $a;
echo "B:". $b;
}
?>
Ответ 18
другой ответ
$a = $a*$b;
$b = $a/$b;
$a = $a/$b;
Ответ 19
$a=5; $b=10; $a=($a+$b)-$a; $b=($a+$b)-$b;