在PHP中,array_filter 函数是一个非常实用的工具,它用于过滤数组中的元素,基于给定的回调函数返回的布尔值来决定是否保留该元素。这个函数常常被用于从数组中剔除不符合条件的元素,或者基于某些逻辑提取数据。
<span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array</span></span><span>, ?</span><span><span class="hljs-keyword">callable</span></span><span> </span><span><span class="hljs-variable">$callback</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$mode</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>
array (必需)
这是你想要进行过滤操作的数组。
callback (可选)
这是一个回调函数,用于判断数组的每个元素是否满足某个条件。如果该参数被设置为 null,array_filter 将会去除数组中的所有“空”值,如 false, null, 0, 空字符串等。
mode (可选)
这是一个常量,用于决定如何使用回调函数来判断数组元素。常用的模式有:
ARRAY_FILTER_USE_KEY:回调函数接收数组的键而不是值。
ARRAY_FILTER_USE_BOTH:回调函数同时接收键和值。
下面是一些常见的 array_filter 使用示例:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$arr</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><span class="hljs-literal">false</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'apple'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>];
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-variable">$arr</span></span><span>);
</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 class="hljs-meta">?></span></span><span>
</span></span>
输出:
<span><span>Array
(
[</span><span><span class="hljs-meta">1</span></span><span>] => </span><span><span class="hljs-number">1</span></span><span>
[</span><span><span class="hljs-meta">3</span></span><span>] => </span><span><span class="hljs-number">2</span></span><span>
[</span><span><span class="hljs-meta">5</span></span><span>] => </span><span><span class="hljs-number">3</span></span><span>
[</span><span><span class="hljs-meta">6</span></span><span>] => apple
[</span><span><span class="hljs-meta">8</span></span><span>] => </span><span><span class="hljs-number">4</span></span><span>
)
</span></span>
在这个示例中,array_filter 过滤掉了所有值为 false、null、0、空字符串等“空”值。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$arr</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>];
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-variable">$arr</span></span><span>, function(</span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span> % </span><span><span class="hljs-number">2</span></span><span> == </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-comment">// 只保留偶数</span></span><span>
});
</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 class="hljs-meta">?></span></span><span>
</span></span>
输出:
<span><span>Array
(
[</span><span><span class="hljs-meta">1</span></span><span>] => </span><span><span class="hljs-number">2</span></span><span>
[</span><span><span class="hljs-meta">3</span></span><span>] => </span><span><span class="hljs-number">4</span></span><span>
)
</span></span>
在这个例子中,array_filter 使用一个回调函数来检查数组中的每个元素是否是偶数,返回值为 true 时,元素就会被保留。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$arr</span></span><span> = [
</span><span><span class="hljs-string">'first'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>,
</span><span><span class="hljs-string">'second'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>,
</span><span><span class="hljs-string">'third'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>,
</span><span><span class="hljs-string">'fourth'</span></span><span> => </span><span><span class="hljs-number">4</span></span><span>
];
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-variable">$arr</span></span><span>, function(</span><span><span class="hljs-variable">$key</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-string">'t'</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-comment">// 只保留键以't'开头的元素</span></span><span>
}, ARRAY_FILTER_USE_KEY);
</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 class="hljs-meta">?></span></span><span>
</span></span>
输出:
<span><span>Array
(
[</span><span><span class="hljs-meta">third</span></span><span>] => </span><span><span class="hljs-number">3</span></span><span>
[</span><span><span class="hljs-meta">fourth</span></span><span>] => </span><span><span class="hljs-number">4</span></span><span>
)
</span></span>
这个例子演示了如何根据数组键进行过滤,ARRAY_FILTER_USE_KEY 让回调函数接收数组的键而不是值。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$arr</span></span><span> = [
</span><span><span class="hljs-string">'apple'</span></span><span> => </span><span><span class="hljs-number">5</span></span><span>,
</span><span><span class="hljs-string">'banana'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>,
</span><span><span class="hljs-string">'orange'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>,
</span><span><span class="hljs-string">'grape'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>
];
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-variable">$arr</span></span><span>, function(</span><span><span class="hljs-variable">$value</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span> > </span><span><span class="hljs-number">1</span></span><span> && </span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-string">'a'</span></span><span>) !== </span><span><span class="hljs-literal">false</span></span><span>; </span><span><span class="hljs-comment">// 保留值大于1且键中包含'a'的元素</span></span><span>
}, ARRAY_FILTER_USE_BOTH);
</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 class="hljs-meta">?></span></span><span>
</span></span>
输出:
<span><span>Array
(
[</span><span><span class="hljs-meta">apple</span></span><span>] => </span><span><span class="hljs-number">5</span></span><span>
[</span><span><span class="hljs-meta">orange</span></span><span>] => </span><span><span class="hljs-number">2</span></span><span>
)
</span></span>
此示例使用 ARRAY_FILTER_USE_BOTH,让回调函数同时使用键和值进行过滤操作。结果会保留值大于1且键中包含字母 'a' 的元素。
回调函数的返回值:
回调函数的返回值必须是布尔值 true 或 false。如果返回 true,则该元素会被保留,返回 false 时则会被剔除。
性能考虑:
array_filter 会遍历整个数组进行检查。如果数组非常大,且回调函数很复杂,可能会影响性能。在这种情况下,考虑是否可以优化回调函数,或者使用其他方法。
键的保持:
array_filter 在过滤时会保持原始数组的键。这意味着如果你从数组中剔除了元素,结果数组中的键将不会重新索引。
array_filter 是一个非常强大的函数,可以用来根据各种条件过滤数组中的元素。它不仅支持基本的过滤操作,还提供了灵活的回调函数和多种模式,能够帮助你在处理数据时更加高效。理解和正确使用 array_filter 可以让你的代码更加简洁和高效,尤其是在处理大规模数据或需要特定过滤条件的场景中。
相关标签:
array_filter