PHP中使用独立数组统计状态计数为何无法递增?
问题分析与解决
哈哈,这个坑我刚接触PHP的时候也踩过!核心问题出在你判断状态是否存在的逻辑上——你用了in_array(),但它是用来检查数组的值,而不是关联数组的键!
为什么计数永远是1?
咱们一步步拆解循环过程:
- 第一次遇到状态
'a'时,$statuses是空数组,in_array('a', $statuses)返回false,于是你把$statuses['a']设为0,加1后变成1。 - 第二次再遇到
'a'时,$statuses已经是["a" => 1],in_array('a', $statuses)会去遍历数组的值(也就是1),找有没有等于'a'的元素——显然找不到,所以又会把$statuses['a']重置为0,加1后回到1。 - 所有状态都会重复这个“重置→加1”的过程,最终每个状态的计数永远停在
1。
修正方案
方案1:用array_key_exists()检查键是否存在
把判断条件改成检查数组的键,而不是值:
$data = array( array('status'=>'a'), array('status'=>'b'), array('status'=>'c'), array('status'=>'c'), array('status'=>'c'), array('status'=>'c'), array('status'=>'c'), array('status'=>'c'), array('status'=>'c'), array('status'=>'b'), array('status'=>'b'), array('status'=>'a'), array('status'=>'a'), array('status'=>'a'), ); $statuses = array(); foreach($data as $row) { $status = $row['status']; if(!array_key_exists($status, $statuses)) { $statuses[$status] = 0; } $statuses[$status] += 1; } var_dump($statuses);
方案2:更简洁的isset()判断
isset()可以直接检查键是否存在且不为null,写法更紧凑:
$statuses = array(); foreach($data as $row) { $status = $row['status']; $statuses[$status] = isset($statuses[$status]) ? $statuses[$status] + 1 : 1; }
方案3:PHP 7+的空合并运算符(最简洁)
如果你的PHP版本是7及以上,用空合并运算符可以一行搞定赋值+递增:
$statuses = array(); foreach($data as $row) { $status = $row['status']; $statuses[$status] = ($statuses[$status] ?? 0) + 1; }
方案4:用内置函数一行解决(推荐)
PHP有现成的函数组合可以直接完成统计:用array_column()提取所有status值,再用array_count_values()直接统计每个值的出现次数:
$statuses = array_count_values(array_column($data, 'status')); var_dump($statuses);
运行以上任意修正后的代码,都会得到正确结果:
array(3) { ["a"]=> int(4) ["b"]=> int(3) ["c"]=> int(7) }
内容的提问来源于stack exchange,提问作者Subtlebot
相关产品推荐
相关产品推荐

