变量变量如何与++运算符一起使用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了变量变量如何与++运算符一起使用?相关的知识,希望对你有一定的参考价值。
给定一个数组(例如:$a = [2,3,3,1,5,2]
),找到第一个副本。在这种情况下,在索引2处将是值3。
第二个副本将是2,因为索引更高(5)。
我在网上找到的解决方案:
function firstDuplicate($a) {
foreach ($a as $v)
if ($$v++) return $v;
return -1;
}
$$v++
如何运作?
$$v
在第一次循环时等于2美元,在第二次循环时等于3美元,依此类推。
++如何应用于此上下文?谢谢!
稍后编辑:$$ v ++什么时候返回true?
这里有两件事情在玩。代码以一种非常有趣的方式编写,虽然很难理解。
第一:variable variables
如你所知,是的每次互动$$v
将翻译变量,分别为$2, $3, $3, $1, $5, $2
。
php非常灵活(甚至可能太多)所以它允许*测试if ($2)
,即使$2
显然从未实例化过。它假定NULL
为其值,因此if检查无法通过。
*“注意:未定义的变量:$ 2”将在日志中抛出,但这不会“破坏”代码也不会阻止它的执行。
第二名:Incrementing/Decrementing operators(++
)
理解预增量和后增量之间的区别非常重要。
$a = 0;
$b = 0;
($a++ === 1) // FALSE
(++$b === 1) // TRUE
预增量添加到变量然后返回它的(新的,添加的)值;虽然后增量返回变量的当前值,然后才增加它。
结合两者
为了便于阅读,让我们翻译这一行
if ($$v++) return $v;
成
if ($$v) {
return $v;
}
$$v = $$v + 1;
因为这才是真正发生的事情。
跳到第二次迭代(数组中的第一个3
,其中$v = 3
,我们有:
// Right now $3 doesn't exist, so it's value is NULL
if ($3) { // "if (NULL)", so it's FALSE
return 3;
}
$3 = $3 + 1; // "NULL + 1"
// $3 === 1 at this point
为什么PHP编译
NULL + 1
=1
完全是另一个话题(“过于灵活”,还记得吗?)。底线假设NULL
的数值是0
,所以0 + 1 = 1
被解析。
现在谈到第三次迭代(数组中的第二个3
,$v = 3
再次出现 - 但此时变量$3
存在,它的值是1
)
// Right now: $3 === 1
if ($3) { // TRUE
return 3;
}
$3 = $3 + 1; // This line is never reached, the code has "returned" already
这就是它,希望它有点容易理解。这是必须结合才能有意义的许多不同部分。
$$
是“变量变量”的一部分,这是一个功能强大但经常被误用的PHP功能。
在你的情况下,与$a = [2,3,3,1,5,2]
function firstDuplicate($a) {
foreach ($a as $v)
if ($$v++) return $v;
return -1;
}
$$v
将等同于未定义的变量$3
。
然后$3++
将创建一个值为$3
的变量0
,if语句的条件将为false。
当再次调用$3++
时(当找到副本时),它将具有1
的值,这使得if
语句通过,而return $v;
将通过返回第一个副本($v
的值)来终止该函数。
注意:0
等于False
,每个非零值都被认为是True
。
以上是关于变量变量如何与++运算符一起使用?的主要内容,如果未能解决你的问题,请参考以下文章