PHP如何优雅统计多维数组中指定键的出现次数
问题描述
现有如下PHP业务代码,用于统计题目总数和已作答题目数量:
$arr = array( 0 => array( 'question' => 'Question 1', 'choices' => array( 0 => 'Choice 1', 1 => 'Choice 2', 2 => 'Choice 3', ), 'valid' => 'Valid', 'answer' => 'Answer', ), 1 => array( 'question' => 'Question 2', 'choices' => array( 0 => 'Choice 1', 1 => 'Choice 2', 2 => 'Choice 3', ), 'valid' => 'Valid', ), 2 => array( 'question' => 'Question 3', 'choices' => array( 0 => 'Choice 1', 1 => 'Choice 2', 2 => 'Choice 3', ), 'valid' => 'Valid', 'answer' => 'Answer', ), 3 => array( 'question' => 'Question 4', 'choices' => array( 0 => 'Choice 1', 1 => 'Choice 2', 2 => 'Choice 3', ), 'valid' => 'Valid', ), ); $answered = 0; foreach ($arr as $q) { if (isset($q['answer'])) { $answered++; } } echo 'Questions: ' . count($arr) . '<br>' . 'Answered questions: ' . $answered;
代码运行后输出结果:
Questions: 4 Answered questions: 2
当前实现通过foreach循环遍历+isset判断的方式统计已作答题目数量,本质是统计二维数组中键名answer的出现次数,完全可以通过PHP内置函数实现更简洁优雅的写法,不需要手动写循环计数逻辑。
可选实现方案
- 最简写法:
array_column+count
这是最简洁、语义最清晰的实现方式,array_column原生支持提取多维数组中指定键的所有值,会自动过滤掉不存在目标键的子项,直接统计返回结果的长度即可得到已作答数量:
$answered = count(array_column($arr, 'answer'));
这种写法没有手动循环、没有临时计数变量,一行代码就能完成需求,可读性极强,适合仅判断键是否存在的简单统计场景。
- 灵活扩展写法:
array_reduce
如果后续需要附加额外判断规则(比如答案不能为空、答案符合格式要求才算有效作答),可以用array_reduce实现函数式的计数,没有外部变量副作用,逻辑内聚:
$answered = array_reduce($arr, function($count, $question) { // 可在此处扩展更多判断逻辑,比如!empty($question['answer']) return $count + (isset($question['answer']) ? 1 : 0); }, 0);
- 箭头函数写法(PHP 7.4+)
PHP 7.4版本支持箭头函数后,可以用array_filter配合箭头函数实现更简洁的条件过滤,再统计结果数量:
$answered = count(array_filter($arr, fn($q) => isset($q['answer'])));
方案选择建议
- 无额外判断逻辑、仅统计指定键存在的数量时,优先选
array_column方案,代码最短、性能也最优 - 需要附加作答有效性判断时,选
array_reduce或array_filter方案,扩展逻辑更方便
内容的提问来源于stack exchange,提问作者Faye D.
相关产品推荐
相关产品推荐

