過濾陣列
為了從陣列中過濾掉值並獲得包含滿足過濾條件的所有值的新陣列,可以使用 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_KEY
或 ARRAY_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!