PHP代码中echo $$v++输出1或true的原因是什么?
<?php function firstDuplicate($a) { foreach ($a as $v) echo $$v++; return -1; } firstDuplicate([2, 1, 3, 5, 3, 2]);
运行原理说明
涉及三个PHP基础语法特性的共同作用:
- 可变变量语法
$$v:会将$v的取值作为动态变量名,读取/创建对应变量。例如当$v=3时,$$v等价于读取变量$3。 - 后置递增
++的运算规则:先返回变量的当前值作为整个表达式的结果,再对变量本身执行+1操作。 - 未定义变量的默认处理:PHP读取从未声明过的变量时,默认取值为
null,null执行+1操作后会自动转换为整数1。
逐轮执行过程
传入数组为[2, 1, 3, 5, 3, 2],循环逐次执行逻辑如下:
- 第一次
$v=2:读取未定义的$2取null,后置++先返回null输出空,随后$2自增为1 - 第二次
$v=1:读取未定义的$1取null,后置++先返回null输出空,随后$1自增为1 - 第三次
$v=3:读取未定义的$3取null,后置++先返回null输出空,随后$3自增为1 - 第四次
$v=5:读取未定义的$5取null,后置++先返回null输出空,随后$5自增为1 - 第五次
$v=3:读取已存在的$3当前值为1,后置++先返回1输出,随后$3自增为2 - 第六次
$v=2:读取已存在的$2当前值为1,后置++先返回1输出,随后$2自增为2
你观察到的输出1就是当循环命中重复元素时,返回了之前自增后存储的1值。完整运行这段代码最终会输出拼接后的11。
额外说明:这是PHP里用可变变量代替哈希表实现O(n)复杂度查找首个重复元素的技巧,常规写法会把echo $$v++换成if($$v++) return $v,第一次命中重复值时$$v++返回1判断为真,直接返回对应元素即可。
内容的提问来源于stack exchange,提问作者user8571743
相关产品推荐
相关产品推荐

