Подтвердить что ты не робот

Есть ли функция PHP для замены значений двух переменных?

Скажем, например, у меня есть...

$var1 = "ABC"
$var2 = 123

и при определенных условиях я хочу поменять местами два так, как...

$var1 = 123
$var2 = "ABC"

Есть ли функция PHP для этого, а не для создания третьей переменной для хранения одного из значений, а затем переопределения каждого из них, например...

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

Для такой простой задачи, вероятно, быстрее использовать третью переменную, и я всегда мог бы создать свою собственную функцию, если бы захотел. Просто интересно, существует ли что-то подобное?

Обновление: использование 3-ей переменной или ее упаковка в функции - лучшее решение. Это чисто и просто. Я задал вопрос больше из любопытства, и выбранный ответ был своего рода "лучшей альтернативой". Просто используйте третью переменную.

4b9b3361

Ответ 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, он не очень эффективен и дороже, чем использование временной переменной. Возможно, обратите внимание на очень большой цикл.

Однако ситуация, когда это необходимо, немного пахнет мне. Если вы хотите обсудить это: для чего вам это нужно?

Ответ 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);

Ответ 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;