針對二維、三維數組的條件過濾,PHP 內建 array_map + array_filter 組合比嵌套 foreach 更聲明式。本文給出三種典型結構的處理代碼。
// 二維數組 $arr = [[1,3,5,7,9], [2,4,6,8,0]]; // 三維數組:鍵 'list' 包裹二維陣列 $arr2 = ['list' => [[1,3,5,7], [2,4,6,8], [3,2,9,0]]]; // 三維數組:頂層鍵為 'list' $arr3 = ['list' => [[1,3,5,7], [2,4,6,8], [3,2,9,0]]];
$res = array_map(function($row) {
return array_filter($row, fn($v) => $v !== 5);
}, $arr);
// [[1,3,7,9], [2,4,6,8,0]]
$res2 = array_map(function($subArr) {
return array_filter($subArr, fn($v) => !in_array(6, $v));
}, $arr2['list']);
// [[1,3,5,7], [3,2,9,0]] // 中間 [2,4,6,8] 被整個移除
$res3 = [];
array_walk($arr3, function($val, $key) use (&$res3) {
$res3[$key] = array_filter($val, fn($v) => !in_array(6, $v));
});
// ['list' => [[1,3,5,7], [3,2,9,0]]]
| 函數 | 保留鍵名 | 適用場景 |
|---|---|---|
array_map | 否(重建索引) | 純值轉換、扁平化處理 |
array_walk | 是(引用修改) | 需保持關聯鍵、就地修改 |
array_filter | 是(默認保留鍵) | 單層過濾 |
fn($v) => ... 簡潔明瞭,自動捕獲外部變量。deepFilter($arr, callable $fn)。yield 逐行處理,避免一次性載入記憶體。善用高階函數能讓數組處理代碼更具可讀性與可組合性。