是否有用于交换两个变量值的PHP函数?

Tay*_*lor 70 php swap function

比如我说......

$var1 = "ABC"
$var2 = 123
Run Code Online (Sandbox Code Playgroud)

在某些条件下,我想像这样交换两个......

$var1 = 123
$var2 = "ABC"
Run Code Online (Sandbox Code Playgroud)

是否有一个PHP函数来执行此操作,而不是必须创建第三个变量来保存其中一个值,然后重新定义每个值,如此...

$var3 = $var1
$var1 = $var2
$var2 = $var3
Run Code Online (Sandbox Code Playgroud)

对于这样一个简单的任务,无论如何它使用第三个变量可能更快,如果我真的想,我总是可以创建自己的函数.只是想知道这样的东西是否存在?

更新:使用第三个变量或将其包装在函数中是最佳解决方案.它干净简单.我出于好奇而问了这个问题,选择的答案是"下一个最好的选择".只需使用第三个变量.

evi*_*iko 100

没有内置功能.

正如许多人提到的,有3种方法可以做到这一点:

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));
}
Run Code Online (Sandbox Code Playgroud)

我在1000次迭代的for循环中测试了3种方法,以找到它们中最快的:

  • swap1 =得分近似平均值为0.19秒.
  • swap2 =得分近似平均值为0.42秒.
  • swap3 =得分近似平均值为0.16秒.

为了可读性/可写性,IMO我发现swap3比其他2个功能更好.

2017年更新:

  • 由于函数调用,swap2总是慢于其他的.
  • swap1和swap3两者的性能速度非常相似,但大多数时候swap3稍微快一些.
  • 警告: swap1仅适用于数字!

  • swap1不适用于字符串和其他对象 (7认同)
  • 改变了这个问题的答案,因为这个问题似乎得到了很多关注,而且你已经标记了它们.swap3与函数中包含的原始问题基本相同.证明简单性通常更好,即使它意味着额外的线条! (3认同)
  • 是的,我也支持您的摘要。但是您可以删除`swap1`,它确实有些废话。 (2认同)
  • 对于它的价值,现在可以根据下面的[@Pawel Dubiel的答案](/sf/answers/2778499531/)重写`swap2()`,并且比以前快得多***这些基准已被写入。我自己运行了一些基准测试,经过超过 100 万次迭代,它只比 `swap3()` 多花了 0.01 秒,这当然可以忽略不计。另外,“[$a, $b] = [$b, $a];”看起来很棒。 (2认同)

Pek*_*ica 80

我不知道有什么功能,但Pete Graham有一个单行礼貌:

list($a,$b) = array($b,$a);
Run Code Online (Sandbox Code Playgroud)

但是,从维护的角度来看,我不确定自己是否喜欢这个,因为理解它并不是很直观.

另外,正如@Paul Dixon指出的那样,它不是非常有效,而且比使用临时变量更昂贵.可能在一个非常大的循环中注意到.

但是,无论如何,这种情况对我来说有点不对.如果你想讨论它:你需要什么?

  • 因为这是可以教育他人的问题的公认答案,所以值得指出这是多么低效.你要求PHP创建一个数组,只是立即丢弃它.我使用临时变量对这种方法进行了基准测试,发现使用临时变量的速度要快7倍.我也认为这也使意图更清晰,因为这是一个常见的习语! (27认同)
  • +1 - 发现相同,并同意,不确定我喜欢它 - 使用临时变量要好得多 - 就像你自己经常这样做时编写自己的交换方法一样. (3认同)
  • 而且由于这个回答者持怀疑态度,是什么让我觉得PHP是否有内置的`swap()`是迭代通过一个数组,其中键保持值 - 例如,它们表示数据库中的列,值表示值.但是,如果没有一对,只有一个值,那么您可以选择使用该值作为键(交换)并使用默认值.因为在我的例子中我不需要保留密钥,它不是_really_必需,但如果我确实需要保持数组索引,我宁愿使用(bult-in)`swap()`调用而不是创建一个愚蠢地命名为临时的.但是,这不是内置的...... (2认同)

Paw*_*iel 29

是的,现在有类似的东西.它不是一个函数,而是一个语言结构(自PHP 7.1起可用).它允许这种简短的语法:

 [$a, $b] = [$b, $a];
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅"数组解构分配的方括号语法".

  • 我投票给这个,因为:它很容易完成_内联_,而且只有_一行_(我没有测试它是否比函数调用选项运行得更快。)我的编程时间通常比计算机时间更有价值。 (5认同)

Paw*_*iel 16

也可以使用旧的XOR技巧(但它只适用于整数,并且它不会使代码更容易阅读..)

$a ^= $b ^= $a ^= $b;
Run Code Online (Sandbox Code Playgroud)

  • 好吧,'数字'. (3认同)
  • 如果你使用含有相同部分的单词,它会返回有趣且意想不到的结果:http://ideone.com/NGQVYH (2认同)

Jus*_*ier 9

是的,试试这个:

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

// Swap $a and $b
list($a, $b) = array($b, $a);
Run Code Online (Sandbox Code Playgroud)

这让我想起了python,这样的语法完全有效:

a, b = b, a
Run Code Online (Sandbox Code Playgroud)

遗憾的是你不能在PHP中完成上述操作......


Pra*_*nth 7

其他方式:

$a = $b + $a - ($b = $a);
Run Code Online (Sandbox Code Playgroud)


小智 6

对于数字:

$a = $a+$b;
$b = $a-$b;
$a = $a-$b;
Run Code Online (Sandbox Code Playgroud)

工作:

设$ 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!)


Tho*_*son 5

list($var1,$var2) = array($var2,$var1);
Run Code Online (Sandbox Code Playgroud)