過濾陣列

為了從陣列中過濾掉值並獲得包含滿足過濾條件的所有值的新陣列,可以使用 array_filter 函式。

過濾非空值

最簡單的過濾方法是刪除所有值:

$my_array = [1,0,2,null,3,'',4,[],5,6,7,8];
$non_empties = array_filter($my_array); // $non_empties will contain [1,2,3,4,5,6,7,8]; 

通過回撥過濾

這次我們定義自己的過濾規則。假設我們只想得到偶數:

$my_array = [1,2,3,4,5,6,7,8];

$even_numbers = array_filter($my_array, function($number) {
    return $number % 2 === 0;   
});

array_filter 函式接收要過濾的陣列作為其第一個引數,以及將過濾謂詞定義為第二個引數的回撥。

Version >= 5.6

按索引過濾

可以向 array_filter 函式提供第三個引數,該引數允許調整傳遞給回撥的值。此引數可以設定為 ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH,這將導致回撥接收鍵而不是陣列中每個元素的值,或者值和鍵作為其引數。例如,如果要處理索引而不是值:

$numbers = [16,3,5,8,1,4,6];

$even_indexed_numbers = array_filter($numbers, function($index) {
    return $index % 2 === 0;
}, ARRAY_FILTER_USE_KEY);

過濾後的陣列中的索引

請注意,array_filter 保留原始陣列鍵。一個常見的錯誤是嘗試在過濾後的陣列上使用 for 迴圈:

<?php

$my_array = [1,0,2,null,3,'',4,[],5,6,7,8];
$filtered = array_filter($my_array); 

error_reporting(E_ALL); // show all errors and notices

// innocently looking "for" loop
for ($i = 0; $i < count($filtered); $i++) {
   print $filtered[$i];
}

/*
Output:
1
Notice: Undefined offset: 1
2
Notice: Undefined offset: 3
3
Notice: Undefined offset: 5
4
Notice: Undefined offset: 7
*/

這是因為位置 1(有 0),3(null),5(空字串'')和 7(空陣列 [])上的值以及它們對應的索引鍵被刪除。

如果需要在索引陣列上迴圈遍歷過濾器的結果,則應首先在 array_filter 的結果上呼叫 array_values,以便建立具有正確索引的新陣列:

$my_array = [1,0,2,null,3,'',4,[],5,6,7,8];
$filtered = array_filter($my_array); 
$iterable = array_values($filtered);

error_reporting(E_ALL); // show all errors and notices

for ($i = 0; $i < count($iterable); $i++) {
   print $iterable[$i];
}

// No warnings!