变量变量如何与++运算符一起使用?

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

以上是关于变量变量如何与++运算符一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

将 IF 条件与存储在变量中的比较运算符一起使用

将运算符与其他参数一起传递

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

将 ConcatRelated() 与变量一起使用

如何使用Android片段管理器传递变量[重复]

如何创建片段以重复变量编号中的代码行