当前位置: 首页> 最新文章列表> 使用 array_intersect_uassoc 过滤嵌套数组中的特定键值对,应该怎么做?

使用 array_intersect_uassoc 过滤嵌套数组中的特定键值对,应该怎么做?

gitbox 2025-07-26

1. 理解 array_intersect_uassoc 的函数签名

array_intersect_uassoc 的基本函数签名如下:

<span><span><span class="hljs-title function_ invoke__">array_intersect_uassoc</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-keyword">callable</span></span><span> </span><span><span class="hljs-variable">$key_compare_func</span></span><span>): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>
  • $array1, $array2:要比较的数组。

  • $key_compare_func:用于比较键的回调函数。

这个函数返回的是两个数组在键和值都相等的情况下交集的结果。如果你需要多个数组的交集,可以提供更多的数组参数。

2. 用例:过滤嵌套数组中的特定键值对

假设你有如下嵌套数组,里面包含一些学生的信息,每个学生有 idnamescore 等字段,你希望基于特定条件筛选出满足要求的学生:

<span><span><span class="hljs-variable">$students</span></span><span> = [
    </span><span><span class="hljs-string">'a'</span></span><span> =&gt; [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Tom'</span></span><span>, </span><span><span class="hljs-string">'score'</span></span><span> =&gt; </span><span><span class="hljs-number">85</span></span><span>],
    </span><span><span class="hljs-string">'b'</span></span><span> =&gt; [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Jerry'</span></span><span>, </span><span><span class="hljs-string">'score'</span></span><span> =&gt; </span><span><span class="hljs-number">90</span></span><span>],
    </span><span><span class="hljs-string">'c'</span></span><span> =&gt; [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Anna'</span></span><span>, </span><span><span class="hljs-string">'score'</span></span><span> =&gt; </span><span><span class="hljs-number">78</span></span><span>],
    </span><span><span class="hljs-string">'d'</span></span><span> =&gt; [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Lucy'</span></span><span>, </span><span><span class="hljs-string">'score'</span></span><span> =&gt; </span><span><span class="hljs-number">92</span></span><span>]
];
</span></span>

如果你希望从中筛选出分数大于 80 的学生,你需要通过 array_intersect_uassoc 比较数组的键和值,并且需要使用一个自定义的键值比较函数来实现条件过滤。

3. 自定义比较函数

我们将编写一个比较函数,用来判断学生的分数是否大于 80。这个函数将接收两个参数:键和值。通过 array_intersect_uassoc,它会根据 score 值进行过滤。

<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">compare_scores</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$key1</span></span></span><span>, </span><span><span class="hljs-variable">$val1</span></span><span>, </span><span><span class="hljs-variable">$key2</span></span><span>, </span><span><span class="hljs-variable">$val2</span></span><span>) {
    </span><span><span class="hljs-comment">// 只根据学生分数进行比较</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$val1</span></span><span>[</span><span><span class="hljs-string">'score'</span></span><span>] &gt; </span><span><span class="hljs-number">80</span></span><span> ? </span><span><span class="hljs-number">0</span></span><span> : </span><span><span class="hljs-number">1</span></span><span>;
}
</span></span>

4. 使用 array_intersect_uassoc 进行筛选

接下来,我们使用 array_intersect_uassoc 来筛选出符合条件的学生数组:

<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_intersect_uassoc</span></span><span>(</span><span><span class="hljs-variable">$students</span></span><span>, </span><span><span class="hljs-variable">$students</span></span><span>, </span><span><span class="hljs-string">'compare_scores'</span></span><span>);
</span></span>

在上面的代码中,我们使用了 $students 数组作为第一个和第二个参数,因为我们只是想根据自定义的 compare_scores 函数过滤数组中的特定元素。这个函数会根据学生的 score 字段对每个元素进行筛选。

5. 输出结果

筛选后的结果将包含分数大于 80 的学生信息:

<span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>

输出将是:

<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [a] =&gt; </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
        (
            [id] =&gt; </span><span><span class="hljs-number">1</span></span><span>
            [name] =&gt; Tom
            [score] =&gt; </span><span><span class="hljs-number">85</span></span><span>
        )
    [b] =&gt; </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
        (
            [id] =&gt; </span><span><span class="hljs-number">2</span></span><span>
            [name] =&gt; Jerry
            [score] =&gt; </span><span><span class="hljs-number">90</span></span><span>
        )
    [d] =&gt; </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
        (
            [id] =&gt; </span><span><span class="hljs-number">4</span></span><span>
            [name] =&gt; Lucy
            [score] =&gt; </span><span><span class="hljs-number">92</span></span><span>
        )
)
</span></span>

可以看到,只有 score 大于 80 的学生被筛选出来了。