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

给定一个数组(例如:$a = [2,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,$1,$5,$2.

PHP非常灵活(甚至可能太多),所以它允许*测试if($2),即使$2显然从未实例化过.它假定NULL为其值,因此if检查无法通过.

* “Notice: Undefined variable: $2” will be thrown in the logs but that doesn’t “break” the code nor prevents it’s execution.

第二名: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

Why PHP compiles NULL + 1 = 1 that’s another topic altogether (“too flexible”,remember?). Bottomline it assumes NULL‘s numeric value is 0,so 0 + 1 = 1 is parsed.

现在谈到第三次迭代(数组中的第二次迭代,其中$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

这就是它,希望它有点容易理解.这是必须结合才能有意义的许多不同部分.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...