array_count_values函数报错求助:PHP数组$emp值统计问题
解决array_count_values()类型错误的问题
这个问题我之前也碰到过!array_count_values()确实有个严格的限制——它只能统计**字符串(string)和整数(integer)**类型的值,你的$emp数组里肯定混了其他类型的元素(比如嵌套数组、null、布尔值或者对象),所以才会弹出那个错误提示。下面根据不同的场景给你对应的解决办法:
场景1:$emp是嵌套数组(每个元素是包含hadir字段的数组)
如果你的$emp结构是类似这样的:
$emp = [ ['hadir' => 0], ['hadir' => 0], ['hadir' => 1], ['hadir' => 2], ];
你需要先提取所有hadir字段的值,再用array_count_values()统计:
// 提取所有hadir字段的值 $hadir_values = array_column($emp, 'hadir'); // 统计各值出现的次数 $counts = array_count_values($hadir_values); // 格式化输出你要的结果 foreach ($counts as $key => $value) { echo "hadir $key = $value\n"; }
运行后就能得到你想要的:
hadir 0 = 2
hadir 1 = 1
hadir 2 = 1
场景2:$emp包含非int/string类型的元素(比如null、float、bool)
如果数组里有null、布尔值或者浮点数这类不符合要求的类型,你需要先标准化元素类型,再过滤无效值:
// 标准化类型:转换为int,同时处理null(这里选择排除null,你可以根据需求调整) $normalized_values = array_map(function($val) { if ($val === null) { return null; } // 把布尔值、浮点数转为整数 return (int)$val; }, $emp); // 过滤掉null值 $filtered_values = array_filter($normalized_values, function($val) { return $val !== null; }); // 统计次数 $counts = array_count_values($filtered_values);
场景3:$emp的元素是对象(每个对象有hadir属性)
如果$emp里是对象实例,每个对象有hadir属性,就用array_map提取属性值:
// 提取对象的hadir属性 $hadir_values = array_map(function($obj) { return $obj->hadir; }, $emp); // 统计次数 $counts = array_count_values($hadir_values);
核心思路就是:先把$emp里的元素统一转换成整数或字符串类型,再交给array_count_values()处理,就能避开类型错误啦!
内容的提问来源于stack exchange,提问作者user7474611
相关产品推荐
相关产品推荐

