PHP如何过滤关联数组,保留所有数组的共同键?
保留数组集合中所有数组共有的键
嘿,这个需求我太熟了!要处理一组关联数组,只保留它们共有的键,核心思路特别清晰:先找出所有数组都存在的键,再用这个键集合去过滤每个数组。下面我给你用两种常用语言分别举例说明:
PHP 实现
假设你的数组集合是一个包含所有目标数组的大数组,比如:
// 你的数组集合,包含a、h以及其他可能的数组 $arrayCollection = [ $a, // 99个元素的关联数组 $h, // 72个元素的关联数组 // 这里可以继续添加其他需要处理的数组 ];
步骤分解:
- 提取每个数组的键:用
array_map配合array_keys,把集合里每个数组的键都提取出来,得到一个键数组的集合。 - 计算键的交集:用
call_user_func_array调用array_intersect,计算所有键数组的交集——这就是所有数组共有的键。 - 过滤每个数组:遍历集合,用
array_intersect_key保留每个数组中属于交集的键对应的元素(注意要把键数组转成键值对,用array_flip就行)。
完整代码:
// 步骤1:获取所有数组的键数组 $allKeyArrays = array_map('array_keys', $arrayCollection); // 步骤2:计算所有数组共有的键 $commonKeys = call_user_func_array('array_intersect', $allKeyArrays); // 步骤3:过滤数组集合,只保留共有键的元素 $filteredCollection = array_map(function($currentArray) use ($commonKeys) { // array_intersect_key需要键值对格式的参数,所以用array_flip转换 return array_intersect_key($currentArray, array_flip($commonKeys)); }, $arrayCollection);
JavaScript 实现
如果用JS处理,思路一致,只是API略有不同:
// 你的数组集合,包含a、h等关联数组(JS里就是对象) const arrayCollection = [a, h /* 其他需要处理的对象 */];
步骤分解:
- 把每个数组的键转成Set:Set结构更方便做交集判断。
- 逐步计算键的交集:从第一个数组的键Set开始,依次和其他数组的键Set取交集。
- 过滤每个对象:遍历集合,只保留交集里的键对应的属性。
完整代码:
// 步骤1:将每个对象的键转为Set const keySets = arrayCollection.map(obj => new Set(Object.keys(obj))); // 步骤2:计算所有对象共有的键 let commonKeys = [...keySets[0]]; for (const keySet of keySets.slice(1)) { commonKeys = commonKeys.filter(key => keySet.has(key)); } // 步骤3:过滤每个对象,保留共有键的属性 const filteredCollection = arrayCollection.map(obj => { const filteredObj = {}; commonKeys.forEach(key => { if (obj.hasOwnProperty(key)) { filteredObj[key] = obj[key]; } }); return filteredObj; });
小提示
如果确定h数组的键是所有数组的子集(比如你提到最终要保留72个键,正好是h的元素数),可以直接用h的键作为commonKeys,但还是推荐用通用方法——万一后续添加其他数组,通用方法不用改代码就能自动适配。
内容的提问来源于stack exchange,提问作者Mudd
相关产品推荐
相关产品推荐

