比如我说......
$var1 = "ABC"
$var2 = 123
在某些情况下,我想像这样交换两个......
$var1 = 123
$var2 = "ABC"
是否有用于执行此操作的PHP函数,而不是必须创建第三个变量来保存其中一个值,然后重新定义每个值,如此...
$var3 = $var1
$var1 = $var2
$var2 = $var3
对于这样一个简单的任务,无论如何它使用第三个变量可能更快,如果我真的想,我总是可以创建自己的函数。只是想知道这样的东西是否存在?
更新:使用第三个变量或将其包装在函数中是最佳解决方案。它干净简单。我出于好奇而问了这个问题,选择的答案是“下一个最好的选择”。只需使用第三个变量。
答案 0 :(得分:98)
没有内置功能。使用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));
}
我在1000次迭代的for循环中测试了4种方法,以找到它们中最快的:
swap1()
=得分近似平均值 0.19 秒。swap2()
=得分近似平均值 0.42 秒。 swap3()
=得分近似平均 0.16 秒。 赢家!的 swap4()
=得分近似平均值 0.73 秒。为了便于阅读,我发现swap3()
比其他功能更好。
swap2()
和swap4()
总是比其他的慢。swap1()
和swap3()
两者的效果速度非常相似,但大部分时间swap3()
稍快一些。swap1()
仅适用于数字!答案 1 :(得分:78)
我知道没有任何功能,但有Pete Graham的单行礼貌:
list($a,$b) = array($b,$a);
不确定我是否从维护的角度来看这个,因为理解它并不是很直观。
另外,正如@Paul Dixon指出的那样,它不是非常有效,而且比使用临时变量更昂贵。可能需要注意一个非常大的循环。
但是,无论如何,这种情况对我来说有点不对。如果你想讨论它:你需要什么呢?
答案 2 :(得分:27)
是的,现在有类似的东西。它不是一个函数,而是一个语言结构(自PHP 7.1起可用)。它允许这种简短的语法:
[$a, $b] = [$b, $a];
有关详细信息,请参阅"Square bracket syntax for array destructuring assignment"。
答案 3 :(得分:16)
也可以使用旧的XOR技巧(但它只适用于整数,并且它不会使代码更容易阅读..)
$a ^= $b ^= $a ^= $b;
答案 4 :(得分:9)
是的,请尝试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中执行上述操作......
答案 5 :(得分:7)
另一种方式:
$a = $b + $a - ($b = $a);
答案 6 :(得分:6)
对于数字:
$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!)
答案 7 :(得分:4)
list($var1,$var2) = array($var2,$var1);
答案 8 :(得分:4)
这个更快,需要更少的记忆。
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
答案 9 :(得分:4)
另一种简单的方法
$a=122;
$b=343;
extract(array('a'=>$b,'b'=>$a));
echo '$a='.$a.PHP_EOL;
echo '$b='.$b;
答案 10 :(得分:2)
感谢您的帮助。我把它变成了PHP函数swap()
function swap(&$var1, &$var2) {
$tmp = $var1;
$var1 = $var2;
$var2 = $tmp;
}
代码示例可在以下位置找到:
答案 11 :(得分:2)
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);
答案 12 :(得分:2)
这是另一种不使用临时变量或第三变量的方法。
<?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;
?>
答案 13 :(得分:1)
答案 14 :(得分:1)
如果两个变量都是整数,则可以使用数学方法:
$a = 7; $b = 10; $a = $a + $b; $b = $a - $b; $a = $a - $b;
答案 15 :(得分:-1)
$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;
答案 16 :(得分:-2)
<?php
swap(50, 100);
function swap($a, $b)
{
$a = $a+$b;
$b = $a - $b;
$a = $a - $b;
echo "A:". $a;
echo "B:". $b;
}
?>
答案 17 :(得分:-3)
另一个答案
$a = $a*$b;
$b = $a/$b;
$a = $a/$b;
答案 18 :(得分:-10)
$a=5; $b=10; $a=($a+$b)-$a; $b=($a+$b)-$b;