PHP多维数组:移除指定子数组及键集被包含的子数组
嗨,我来帮你搞定这两个PHP多维数组的处理需求,咱们逐个来拆解:
问题1:移除所有键均被其他子数组包含的子数组
首先得明确需求:如果某个子数组的所有键,都能在另一个子数组中找到(也就是说当前子数组的键集合是另一个子数组键集合的子集),那这个子数组就需要被移除。
实现思路是:先把每个子数组的键转换成集合(方便后续比较),然后遍历每个子数组,检查是否存在其他子数组的键集合完全包含它的键集合,只要存在就过滤掉这个子数组。
下面是具体的函数实现:
function removeSubsetArrays(array $multiArray): array { // 先把每个子数组的键转换成数组,方便后续比较 $keySets = array_map(function($subArray) { return array_keys($subArray); }, $multiArray); // 过滤掉那些是其他子数组键子集的元素 return array_filter($multiArray, function($subArray, $index) use ($keySets) { $currentKeys = $keySets[$index]; // 遍历所有其他键集合,检查是否有包含当前键集合的 foreach ($keySets as $otherIndex => $otherKeys) { if ($index === $otherIndex) continue; // 跳过自己 // 检查当前键集合是否是另一个的子集 if (count(array_diff($currentKeys, $otherKeys)) === 0) { return false; // 是子集,需要移除 } } return true; // 不是任何子集,保留 }, ARRAY_FILTER_USE_BOTH); } // 测试一下(用你提供的数组为例) $originalArray = [ 0 => [10 => 98, 11 => 1, 433438 => 8], 1 => [10 => 98, 11 => 1, 433438 => 1], 2 => [13 => 98, 11 => 2, 433438 => 8], 3 => [14 => 98, 11 => 2, 433438 => 1], 4 => [10 => 18, 11 => 1], 5 => [14 => 18, 11 => 2], ]; $result1 = removeSubsetArrays($originalArray); print_r($result1);
运行后,索引4和5的子数组会被移除,因为它们的键([10,11]和[14,11])分别被索引0/1和3的子数组的键包含。
问题2:移除指定索引(4和5)对应的子数组
这个需求更直接,因为是明确知道要删除的索引,有几种简单的实现方式:
方式1:直接用unset
$originalArray = [ 0 => [10 => 98, 11 => 1, 433438 => 8], 1 => [10 => 98, 11 => 1, 433438 => 1], 2 => [13 => 98, 11 => 2, 433438 => 8], 3 => [14 => 98, 11 => 2, 433438 => 1], 4 => [10 => 18, 11 => 1], 5 => [14 => 18, 11 => 2], ]; // 直接删除指定索引 unset($originalArray[4], $originalArray[5]); // 如果需要重置数组索引(变成连续的0,1,2,3),可以用array_values $result2 = array_values($originalArray); print_r($result2);
方式2:用array_diff_key(适合批量删除多个索引)
$keysToRemove = [4,5]; // 把要删除的索引转成键为索引的数组 $removeMap = array_flip($keysToRemove); $result2 = array_diff_key($originalArray, $removeMap); // 同样,需要重置索引的话用array_values $result2 = array_values($result2); print_r($result2);
两种方式都能达到目的,看你个人习惯选择就行。
这样应该就完美解决你的两个需求啦,如果还有疑问随时提哦~
内容的提问来源于stack exchange,提问作者Kumar Vivek
相关产品推荐
相关产品推荐

