使用in-array时遇到的一个bug

说实话这个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 时 数字型字符串会自动转为数字

原文地址:https://www.cnblogs.com/baozi-tudou/p/14069883.html