给定一个数组(例如:)$a = [2,3,3,1,5,2],找到第一个副本.在这种情况下,在索引2处将是值3.
第二个副本将是2,因为索引更高(5).
我在网上找到的解决方案:
function firstDuplicate($a) {
foreach ($a as $v)
if ($$v++) return $v;
return -1;
}
Run Code Online (Sandbox Code Playgroud)
$$v++工作怎么样?
$$v 在第一次循环时等于2美元,在第二次循环时等于3美元,依此类推.
++如何应用于此上下文?谢谢!
稍后编辑:$$ v ++什么时候返回true?
这里有两件事情在玩.代码以一种非常有趣的方式编写,虽然很难理解.
如您所知,每个交互的是,$$v将分别转换为变量$2, $3, $3, $1, $5, $2.
PHP非常灵活(甚至可能太多),所以它允许*测试,if ($2)即使$2之前从未实例化过.它假设 NULL为其值,因此if检查无法通过.
*"注意:未定义的变量:$ 2"将在日志中抛出,但这不会"破坏"代码也不会阻止它的执行.
++)理解预增量和后增量之间的区别非常重要.
$a = 0;
$b = 0;
($a++ === 1) // FALSE
(++$b === 1) // TRUE
Run Code Online (Sandbox Code Playgroud)
预增量添加到变量然后返回它的(新的,添加的)值; 虽然后增量返回变量的当前值,然后才增加它.
为了便于阅读,让我们翻译这一行
if ($$v++) return $v;
Run Code Online (Sandbox Code Playgroud)
成
if ($$v) {
return $v;
}
$$v = $$v + 1;
Run Code Online (Sandbox Code Playgroud)
因为这才是真正发生的事情.
跳到第二次迭代(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
Run Code Online (Sandbox Code Playgroud)
为什么 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
Run Code Online (Sandbox Code Playgroud)
这就是它,希望它有点容易理解.这是必须结合才能有意义的许多不同部分.