PHP对象数组键值对比问题:筛选未匹配对象的函数错误排查
解决方法:筛选未被回答的$input对象
我来帮你排查这个问题,顺便给出可靠的解决方案~
首先明确你的核心需求:从$input数组中,仅保留那些**id值没有出现在$answers数组任意对象的answer_of字段**中的对象,匹配到的对象直接忽略。
常见错误原因排查
你的unanswered2函数可能出错的点一般有这几个:
- 判断逻辑写反了:比如误把「不在列表中」写成了「在列表中」
- 对象属性访问错误:比如用数组下标
$item['id']访问对象属性,正确应该是$item->id - 遍历效率低且易漏判:每次遍历
$input时都重新遍历$answers对比,可能出现循环逻辑漏洞
正确实现方案
推荐先提取$answers中所有已回答的answer_of值到一个集合,再用array_filter过滤$input,逻辑清晰且高效:
// 第一步:提取$answers中所有answer_of的值,生成已回答ID集合 $answeredIds = array_map(function($answer) { return $answer->answer_of; }, $answers); // 第二步:过滤$input,保留id不在已回答集合中的对象 $unansweredItems = array_filter($input, function($item) use ($answeredIds) { return !in_array($item->id, $answeredIds); });
针对你的示例数据的测试结果
你的$input对象id为2,而$answers中有一个对象的answer_of正好是2,所以执行上述代码后,$unansweredItems会是空数组,完全符合「忽略已匹配对象」的需求。
额外提示
如果需要保留原数组的键名,可以给array_filter传第三个参数ARRAY_FILTER_USE_BOTH,不过一般场景下默认的索引重置就够用了。
内容的提问来源于stack exchange,提问作者Ezzat Harky
相关产品推荐
相关产品推荐

