给定一个数组(例如:$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?
这里有两件事情在玩.代码以一种非常有趣的方式编写,虽然很难理解.
如您所知,是的每次互动$$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 assumesNULL
‘s numeric value is0
,so0 + 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
这就是它,希望它有点容易理解.这是必须结合才能有意义的许多不同部分.