说实话这个bug让我有点意外
$sn = '123-1'; $arr = [ '123' => 12, '321' => 31 ];
要判断$sn 作为key 是否在$arr 里面
正常操作
if ( in_array($sn, array_keys($arr)) ) { $arr[$sn] += 1; } else { $arr[$sn] = 1; }
一切看起来就是那么完美
但是 但是 但是 报出一个异常 索引不存在
通过各种日志 最终发现 if 判断中 返回一个true
通过测试发现 array_keys 在获取数组的key时 如果数组的key为数字型字符串 则会自动转为数字
字符串在和数字做是否相等的比较的时候 有优先将字符串转化为数字
所以事故就出现了
array_keys($arr) // 结果为 [ 123, 321 ] '123-1' == 123 // 返回 true 因为 (int)'123-1' = 123
解决方法
in_array() 方法中还有第三个参数
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : bool // 将第三个参数 设置为 TRUE
昨晚失眠
突然想了一下
我去
不行啊 如果是强类型校验 字符串和数字匹配不上啊
所以还是换种写法吧
if ( !empty($arr[$sn]) ) { $arr[$sn] += $value['num']; } else { $arr[$sn] = $value['num']; }
最终还是 array_keys 的锅
如果key是数字型字符串 在使用array_keys 时 数字型字符串会自动转为数字