如何在PHP中对JSON相关数组去重,生成唯一分类数组
解决PHP对象数组去重问题:移除重复分类项
嘿,我看你现在遇到的问题是生成的分类数组里有重复项,需要把它处理成唯一的形式对吧?咱们来一步步修改代码搞定它!
你的原始问题场景
需求:将数组处理为无重复项的唯一形式,但当前代码生成的$session_activity_category数组包含重复分类。
原始代码:
$session_activity_category = array(); array_walk($search_venue, function($venue_b) use (&$session_activity_category) { $categories = $this->users_model->search_categories_by_session($venue_b->activity_venue_id); foreach ($categories as $category) { $session_activity_category[] = $category; } }); return $this->output ->set_content_type('application/json') ->set_status_header(200) ->set_output(json_encode(array( 'activity_category'=>$session_activity_category, 'activity'=>$session_activity, 'activity_session'=>$search_session, 'activity_venue'=>$search_venue ),JSON_UNESCAPED_SLASHES) );
(重复项示意:标记重复分类的截图)
解决方案:用数组键唯一性实现可靠去重
因为你处理的是对象类型的数组,直接用PHP自带的array_unique()可能不太靠谱(它默认会把对象转成字符串再比较,很可能识别不出重复)。最稳妥的方式是利用每个分类的唯一标识(比如id字段)作为数组的键,这样重复的分类会自动被覆盖,完美实现去重。
修改后的代码如下:
$session_activity_category = array(); array_walk($search_venue, function($venue_b) use (&$session_activity_category) { $categories = $this->users_model->search_categories_by_session($venue_b->activity_venue_id); foreach ($categories as $category) { // 重点:用分类的唯一ID当数组键,相同ID的分类会自动覆盖,实现去重 $session_activity_category[$category->id] = $category; } }); // 可选操作:把关联数组转回索引数组,保持和原代码输出的数组结构一致 $session_activity_category = array_values($session_activity_category); return $this->output ->set_content_type('application/json') ->set_status_header(200) ->set_output(json_encode(array( 'activity_category'=>$session_activity_category, 'activity'=>$session_activity, 'activity_session'=>$search_session, 'activity_venue'=>$search_venue ),JSON_UNESCAPED_SLASHES) );
关键说明
- 核心逻辑:PHP的数组键是唯一的,当你用分类的
id作为键时,同一个分类的重复项会直接覆盖之前的条目,自然就去掉了重复。 - 灵活调整:如果你的分类不是用
id作为唯一标识,换成对应的字段就行(比如category_name、unique_code,只要能唯一区分每个分类就可以)。 - 保持结构:最后用
array_values()把关联数组转回索引数组,这样输出的JSON结构和你原来的代码完全一致,不会影响后续的使用。
这样修改后,$session_activity_category里就只会保留每个分类的唯一实例啦!
内容的提问来源于stack exchange,提问作者Raza Barlas
相关产品推荐
相关产品推荐

