在PHP 中, array_slice()和array_filter()是兩個常用的數組處理函數。一個用於截取數組的一部分,另一個用於篩選數組中符合條件的元素。當我們在處理數據時,常常需要將這兩個函數配合使用。但你是否思考過:
答案是:是的,順序會影響結果,而且在某些場景下影響非常大。
array_filter(array $array, callable|null $callback = null): array
返回通過回調函數過濾後的數組。如果不傳遞回調函數,PHP 會自動移除所有值為false的元素(包括0 , '' , null , false等)。
array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false): array
返回數組中的一段子數組。支持負數偏移量,可以選擇是否保留原始鍵。
假設我們有以下數組:
$data = [0, 1, 2, 3, 4, 5];
我們要對其進行如下操作:
篩選出值大於2 的元素;
從篩選後的結果中取前兩個元素。
$filtered = array_filter($data, function($item) {
return $item > 2;
});
$result = array_slice($filtered, 0, 2);
print_r($result);
輸出:
Array
(
[3] => 3
[4] => 4
)
注意,這裡輸出的是從原數組中過濾出大於2 的元素(即3, 4, 5),然後再取前兩個。如果你沒有設置preserve_keys為true , array_slice會重新索引(設置為false的默認行為),輸出將變為:
$result = array_slice(array_values($filtered), 0, 2);
輸出:
Array
(
[0] => 3
[1] => 4
)
$sliced = array_slice($data, 0, 4);
$result = array_filter($sliced, function($item) {
return $item > 2;
});
print_r($result);
輸出:
Array
(
[3] => 3
)
這裡先取前4 個元素(0, 1, 2, 3),再從中篩選出大於2 的項,結果只有一個: 3 。
如果你想從所有滿足條件的元素中取前幾個結果:應先array_filter ,再array_slice 。
如果你想從原數組中的前幾項中篩選滿足條件的項:應先array_slice ,再array_filter 。
這在分頁、數據流優化、處理大型數據集時尤其關鍵。
假設你有一個API 接口https://gitbox.net/api/posts ,返回的是一個帖子數組。你希望篩選出標題中包含關鍵字“PHP”的前5 個帖子:
$response = file_get_contents('https://gitbox.net/api/posts');
$posts = json_decode($response, true);
$filtered = array_filter($posts, function($post) {
return strpos($post['title'], 'PHP') !== false;
});
$topFive = array_slice(array_values($filtered), 0, 5);
print_r($topFive);
這樣寫就保證了你得到的確實是“所有包含PHP 的帖子中前五個”。
反過來,如果你想只從返回的前10 篇文章中篩選包含“PHP” 的:
$topTen = array_slice($posts, 0, 10);
$filtered = array_filter($topTen, function($post) {
return strpos($post['title'], 'PHP') !== false;
});
print_r($filtered);
順序不同,結果可能大相徑庭。
先過濾後截取,適用於“所有數據中優先選出部分”;
先截取後過濾,適用於“限定前面一部分數據後再篩選”。
在使用array_slice和array_filter組合時,必須明確你的目標數據范圍,從而決定先後順序,避免邏輯錯誤或意外結果。