PHP中按catalogo分组移除同组内重复rfc_inf_aval的方法
解决PHP多维数组按catalogo与rfc_inf_aval组合去重的问题
原始数组
$object = [ [ {"catalogo": "C400047", "rfc_inf_aval": "CIS981002NK4"}, {"catalogo": "C140064","rfc_inf_aval": "MZT8501014S6"}, {"catalogo": "C400047","rfc_inf_aval": "MZT8501014S6"}, {"catalogo": "C400047","rfc_inf_aval": "CIS981002NK4"}, {"catalogo": "C140064","rfc_inf_aval": "MZT8501014S6"}, {"catalogo": "C140064","rfc_inf_aval": "MZT8501014S6"}, {"catalogo": "C140064","rfc_inf_aval": "MZT8501014S6"}, {"catalogo": "C140064","rfc_inf_aval": "CIS981002NK4"}, ], ];
需求说明
移除同一catalogo下重复的rfc_inf_aval条目,仅保留不同的catalogo与rfc_inf_aval组合,最终结果如下:
[ [ {"catalogo": "C400047","rfc_inf_aval": "CIS981002NK4"}, {"catalogo": "C140064","rfc_inf_aval": "MZT8501014S6"}, {"catalogo": "C400047","rfc_inf_aval": "MZT8501014S6"}, {"catalogo": "C140064","rfc_inf_aval": "CIS981002NK4"}, ], ]
错误尝试的代码
以下代码仅根据rfc_inf_aval单独去重,会误删不同catalogo下的相同rfc_inf_aval组合,不符合需求:
for ($i=0; $i < count($object); $i++) { if(!in_array($object[$i]->rfc_inf_aval, $array1)){ array_push($array1, $object[$i]->rfc_inf_aval); array_push($array2, $object[$i]); } }
正确实现方法
核心思路是基于catalogo和rfc_inf_aval的组合做唯一性判断,利用数组键的特性来去重:
如果数组元素是关联数组
// 取出内层数组 $originalItems = $object[0]; $uniqueKeys = []; $result = []; foreach ($originalItems as $item) { // 生成唯一组合键 $combinationKey = $item['catalogo'] . '|' . $item['rfc_inf_aval']; if (!isset($uniqueKeys[$combinationKey])) { $uniqueKeys[$combinationKey] = true; $result[] = $item; } } // 还原为目标二维数组结构 $finalResult = [$result]; print_r($finalResult);
如果数组元素是对象
$originalItems = $object[0]; $uniqueKeys = []; $result = []; foreach ($originalItems as $item) { $combinationKey = $item->catalogo . '|' . $item->rfc_inf_aval; if (!isset($uniqueKeys[$combinationKey])) { $uniqueKeys[$combinationKey] = true; $result[] = $item; } } $finalResult = [$result]; print_r($finalResult);
这段代码会遍历数组,用catalogo和rfc_inf_aval拼接成唯一键,仅保留每个组合的首次出现,既去除同一catalogo下的重复rfc,又保留不同catalogo下的相同rfc组合。
内容的提问来源于stack exchange,提问作者christian alvarez
相关产品推荐
相关产品推荐

