首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 陣列過濾空值的三種實作方法與效能比較

     編輯:PHP 相關知識

需求背景

處理表單提交、API 回傳或資料匯入時,陣列常包含空字串、null 或 false 等「空值」,需在進入業務邏輯前過濾。本文示範三種常見寫法:array_filter、foreach、for 迴圈,並說明適用場景與差異。

測試資料

$array = array("", '', '', '', '', 1, 1, 1, 1, 1);
// 或包含實際內容
$array = array("", '', '2', '', '', 1, 1, 1, 1, 1);
$tarray = array('', '11', '', 'www.bkjia.com', '', '', 'cn.net');

方法一:array_filter + 回呼函式(推薦)

function clear($a) {
    return $a !== ""; // 僅過濾空字串;若需過濾所有 falsy 值可用 return $a;
}

$array = array("", '', '', '', '', 1, 1, 1, 1, 1);
$stt = array_filter($array, "clear");
print_r($stt);

/* 輸出:
Array
(
    [5] => 1
    [6] => 1
    [7] => 1
    [8] => 1
    [9] => 1
)
*/

特點:保留原鍵名、語意清晰、可複用回呼邏輯、PHP 內建優化效能佳。

方法二:foreach 迴圈 + unset(保留鍵名)

$array = array("", '', '2', '', '', 1, 1, 1, 1, 1);
foreach($array as $k => $v) {
    if($v === '') {
        unset($array[$k]);
    }
}
print_r($array);

/* 輸出:
Array
(
    [2] => 2
    [5] => 1
    [6] => 1
    [7] => 1
    [8] => 1
    [9] => 1
)
*/

特點:就地修改、保留非連續鍵名、需注意 foreach 複製陣列行為(PHP 7+ 為值傳遞,unset 影響原陣列)。

方法三:for 迴圈 + unset(重建索引)

$tarray = array('', '11', '', 'www.bkjia.com', '', '', 'cn.net');
$len = count($tarray);
for($i = 0; $i < $len; $i++) {
    if($tarray[$i] === '') {
        unset($tarray[$i]);
    }
}
print_r($tarray);

/* 輸出:
Array
(
    [1] => 11
    [3] => www.bkjia.com
    [6] => cn.net
)
*/

特點:索引保持原位(非連續),若需重建連續索引需額外 array_values()。

進階:過濾所有「空值」

// 利用 array_filter 預設行為(轉型為 false 的值皆被過濾)
$filtered = array_filter($array); 
// 等同於 array_filter($array, function($v) { return (bool)$v; });
// 會移除:""、0、"0"、null、false、array()

效能與選擇建議

方法適用場景效能鍵名處理
array_filter通用、可讀性優先、需複雜條件最佳(C 層實作)保留原鍵
foreach + unset就地修改、需額外邏輯處理良好保留原鍵
for + unset需索引控制、舊版 PHP 相容一般保留原鍵

常見陷阱

  1. 鍵名不連續:過濾後鍵名保持原狀,json_encode 會輸出物件而非陣列,需 array_values() 重建
  2. 0 與 "0" 被誤刪:使用預設 array_filter 會移除數值 0,若 0 為有效值需自訂回呼
  3. 多維陣列:以上方法僅處理第一層,深層需遞迴或 array_walk_recursive
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved