2024 年 PHP Conference Japan

empty

(PHP 4, PHP 5, PHP 7, PHP 8)

empty判斷變數是否為空

說明

empty(混合類型 $var): 布林值

判斷變數是否被視為空。如果變數不存在,或者它的值等於 false,則該變數被視為空。empty() 函式在變數不存在時不會產生警告。

參數

var

要檢查的變數

如果變數不存在,則不會產生警告。這表示 empty() 本質上等同於 !isset($var) || $var == false 的簡潔寫法。

返回值

如果 var 不存在,或者其值為空值或等於零(也就是 falsey 值,參見布林值轉換),則返回 true。否則返回 false

範例

範例 #1 簡單的 empty() / isset() 比較。

<?php
$var
= 0;

// 評估為 true,因為 $var 為空
if (empty($var)) {
echo
'$var 為 0、空值或未設定';
}

// 評估為 true,因為 $var 已設定
if (isset($var)) {
echo
'$var 已設定,即使其值為空';
}
?>

範例 #2 對字串偏移使用 empty()

<?php
$expected_array_got_string
= 'somestring';
var_dump(empty($expected_array_got_string['some_key']));
var_dump(empty($expected_array_got_string[0]));
var_dump(empty($expected_array_got_string['0']));
var_dump(empty($expected_array_got_string[0.5]));
var_dump(empty($expected_array_got_string['0.5']));
var_dump(empty($expected_array_got_string['0 Mostel']));
?>

以上範例將輸出

bool(true)
bool(false)
bool(false)
bool(false)
bool(true)
bool(true)

注意事項

注意因為這是語言結構而非函式,所以不能使用 可變函式具名引數 來呼叫它。

注意事項:

當對不可存取的物件屬性使用 empty() 時,如果已宣告,則會呼叫 __isset() 重載方法。

參見

新增註釋

使用者貢獻的註釋 36 則註釋

Nanhe Kumar
10 年前
<?php
/**
* @author : Nanhe Kumar <nanhe.kumar@gmail.com>
* 所有空值的列表
**/

$testCase = array(
1 => '',
2 => "",
3 => null,
4 => array(),
5 => FALSE,
6 => NULL,
7=>'0',
8=>0,

);

foreach (
$testCase as $k => $v) {
if (empty(
$v)) {
echo
"<br> $k=>$v 是空的";
}
}
/**
輸出
1=> 是空的
2=> 是空的
3=> 是空的
4=>陣列是空的
5=> 是空的
6=> 是空的
7=>0 是空的
8=>0 是空的
**/
?>
mmulej at gmail dot com
1 年前
測試環境:
- Win 11
- Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz 2.21 GHz
- 64GB 記憶體
- PHP 8.1.10 (在 Tinkerwell 中)
重複測試顯示 `empty` > `count` > `=== []`,但差距很小,不值得進行微優化。

註:使用 onlinephp(dot)io 沙盒工具在 PHP v7.4.33 中得到相同的結果(`$n = 10000000`)。

<?php

$test
= range(0, 1000);
$test2 = [];
$n = 1000_000_000;

$t1 = microtime(true); for ($x = 0; $x < $n; $x++) if (count($test)) {}
$t2 = microtime(true); for ($x = 0; $x < $n; $x++) if (count($test2)) {}
$t3 = microtime(true); for ($x = 0; $x < $n; $x++) if ($test === []) {}
$t4 = microtime(true); for ($x = 0; $x < $n; $x++) if ($test2 === []) {}
$t5 = microtime(true); for ($x = 0; $x < $n; $x++) if (empty($test)) {}
$t6 = microtime(true); for ($x = 0; $x < $n; $x++) if (empty($test2)) {}
$t7 = microtime(true);

echo
"count(\$test): " . ($t2 - $t1) . " sec\n";
echo
"count(\$test2): " . ($t3 - $t2) . " sec\n";
echo
"\$test === []: " . ($t4 - $t3) . " sec\n";
echo
"\$test2 === []: " . ($t5 - $t4) . " sec\n";
echo
"empty(\$test): " . ($t6 - $t5) . " sec\n";
echo
"empty(\$test2): " . ($t7 - $t6) . " sec\n";

?>

結果
<?php
count
($test): 18.034885168076 秒
count
($test2): 17.133869886398 秒
$test
=== []: 20.059770107269 秒
$test2
=== []: 14.204195022583 秒
empty($test): 13.583840847015 秒
empty($test2): 12.971315145493 秒
?>
Janci
15 年前
請注意,如果使用了魔術方法 __get(如先前 nahpeps at gmx dot de 所提到的),在呼叫類別中不存在/非公開變數的 empty() 時,其結果可能會有點令人困惑。請參考以下範例:

<?php
class Registry
{
protected
$_items = array();
public function
__set($key, $value)
{
$this->_items[$key] = $value;
}
public function
__get($key)
{
if (isset(
$this->_items[$key])) {
return
$this->_items[$key];
} else {
return
null;
}
}
}

$registry = new Registry();
$registry->empty = '';
$registry->notEmpty = 'not empty';

var_dump(empty($registry->notExisting)); // true,目前為止還算正常
var_dump(empty($registry->empty)); // true,目前為止還算正常
var_dump(empty($registry->notEmpty)); // true,.. 等等,怎麼會這樣?
$tmp = $registry->notEmpty;
var_dump(empty($tmp)); // false,符合預期
?>

empty($registry->notEmpty) 的結果有點出乎意料,因為該值顯然已設定且非空。這是因為 empty() 函式在這些情況下會使用 __isset() 魔術函式。雖然上述文件中已提到這一點,但我認為有必要更詳細地說明,因為此行為並非顯而易見。為了獲得預期結果,您需要在類別中加入 __isset() 魔術函式。

<?php
類別 Registry
{
protected
$_items = array();
public function
__set($key, $value)
{
$this->_items[$key] = $value;
}
public function
__get($key)
{
if (isset(
$this->_items[$key])) {
return
$this->_items[$key];
} else {
return
null;
}
}
public function
__isset($key)
{
if (isset(
$this->_items[$key])) {
return (
false === empty($this->_items[$key]));
} else {
return
null;
}
}
}

$registry = new Registry();
$registry->empty = '';
$registry->notEmpty = 'not empty';

var_dump(empty($registry->notExisting)); // true,目前為止還不錯
var_dump(empty($registry->empty)); // true,目前為止還不錯
var_dump(empty($registry->notEmpty)); // false,終於!
?>

實際上看起來 empty() 傳回的是 __isset() 魔術方法結果的否定,因此上述 __isset() 函式中 empty() 結果的否定。
steven at nevvix dot com
13 年前
當你需要接受這些作為有效、非空值時
- 0 (整數 0)
- 0.0 (浮點數 0)
- "0" (字串 0)

<?php
函式 is_blank($value) {
return empty(
$value) && !is_numeric($value);
}
?>

這類似於 Rails 的 blank? 方法。
info at ensostudio dot ru
3 年前
多個 empty()
<?php
/**
* 檢查多個變數是否為空。
*
* @param mixed[] $vars 要測試的變數
* @return bool
*/
function multi_empty(& ...$vars)
{
// 沒有提供回呼函式,所有空值都會被移除
return array_filter($vars) === [];
}
?>
範例
<?php
$notEmptyVar
= 1;
$emptyVar = null;
// $undefinedVar - 未定義

multi_empty($emptyVar); // true
multi_empty($emptyVar, $undefinedVar); // true
multi_empty($notEmptyVar , $emptyVar); // false
multi_empty($notEmptyVar , $emptyVar, $undefinedVar); // false
?>
chrisdmiddleton at gmail dot com
10 年前
如果您想使用 empty() 來評估一個表達式(而不是一個變數),而且您沒有使用 PHP 5.5+ 版本,您可以透過將 empty 的呼叫包裝在一個函式中來實現,如下所示
<?php
function is_empty($var) {

return empty(
$var);

}
?>
然後您可以執行以下操作
<?php
if(is_empty(NULL)) {
/* ... */
}
?>
這樣就不會有問題,因為測試的是局部變數 $var,而不是函式呼叫本身的表達式。
Claudio Galdiolo
7 年前
警告:「空」物件**不**被視為空值
<?php
$var
= new stdClass(); // 「空」物件
var_dump(empty($var)); // bool(false)
?>

我不知道是否有標準方法來測試「空」物件,我個人使用陣列轉型
<?php
$var
= new stdClass(); // 「空」物件
$var = (array) $var; // 轉型為空陣列
var_dump(empty($var)); // bool(true)
?>
markmanning at gmail dot com
5 年前
我通常使用 count() 計算陣列元素數量,所以我想看看 empty() 的效能如何。

<?php
$test
= array();
$test2 = array();
for (
$x = 0; $x < 1000; $x++) $test[] = $x;

$ts = microtime(true);
for (
$x = 0; $x < 100000000; $x++)
{
if (
count($test))
{
}
}

echo
"Time taken: " . (microtime(true) - $ts) . " sec\n";
?>

在我的硬體上,針對 PHP 7.2.16 進行一億次比較,結果如下:

count($test): 2.697 秒
count($test2): 2.596 秒
$test === array(): 2.579 秒
$test2 === array(): 2.552 秒
empty($test): 3.085 秒
empty($test2): 3.113 秒

簡而言之,使用哪種方法並不重要,儘管 empty() 實際上稍微慢一點,即使它是一個語言建構。實際結果可能有所不同 (YMMV)。
tom at tomwardrop dot com
16 年前
回覆 "admin at ninthcircuit dot info",

使用 str_replace 是不必要的。我鼓勵使用 trim,它很可能更快(尚未測試)也更容易。Trim 也會處理其他空白,例如換行符號和 Tab 字元。實際上,在我編寫的大多數應用程式中,我對 Super Globals(例如 $_POST、$_GET 和 $_COOKIE)使用帶有 trim 的多維陣列映射函數,因為到目前為止,我還沒有遇到任何我希望使用者輸入以空格開頭或結尾的情況。這樣做的好處是,您永遠不必擔心「修剪」您的輸入,這使您的程式碼更簡單、更可靠(以防您忘記修剪某些輸入)。
your dot brother dot t at hotmail dot com
9 年前
(在 PHP 5.6.3 中的經驗)`empty()` 無法明確評估 `__get()` 的結果,因此下面的 `empty()` 陳述式總是呈現 true
<?php
class Juice extends Liquid{
protected
$apple;
protected
$orange;
public function
__get($name) {
return
$this->$name;
}
public function
__construct($apple, $orange) {
$this->apple = $apple;
$this->orange = $orange;
}
}

class
Glass {
protected
$liquid;
public function
__get($name) {
return
$name == "liquid" ? $this->liquid : false;
}
public function
__construct() {
$this->juice = new Juice(3, 5);
}
}

$glass = new Glass();
var_dump(empty($glass->liquid->apple));

/**
* 輸出結果:
* bool(true)
*/
?>

正確的做法是強制先執行 `__get()`,方法是在隱式陳述式周圍加上額外的大括號,如下所示:
<?php
var_dump
(empty(($glass->liquid->apple)));

/**
* 輸出結果:
* bool(false)
*/
?>

因此,如果您正在使用套件,而這些套件使用了物件導向設計和 `__get()` 之類的魔術方法,那麼在呼叫 `empty()` 時,最好一律使用雙重大括號。
marko dot crni at gmail dot com
14 年前
呼叫不存在的物件屬性,例如 `empty($object->prop)`,會觸發 `__isset()`,就像 `isset($object->prop)` 一樣,但兩者之間有一個差異。如果 `__isset()` 返回 TRUE,則會再次呼叫 `__get()`,而 `empty()` 的實際返回值將會是 `__get()` 的結果。
aidan1103 at yahoo dot com
14 年前
`empty()` 的返回值不一定是 `__isset()` 魔術方法結果的否定,如果您將資料成員設定為 0,`isset()` 應該返回 true,而 `empty()` 也應該返回 true。`__isset` 魔術方法的更簡單實作如下:

public function __isset($key) {
return isset($this->{$key});
}

我不明白為什麼這沒有包含在 stdClass 中,並預設被繼承。
martin dot aarhof at gmail dot com
12 年前
<?php
$str
= ' ';
var_dump(empty($str)); // boolean false
?>

所以記得要先清除字串中的空白字元!

<?php
$str
= ' ';
$str = trim($str);
var_dump(empty($str)); // boolean true
?>
GazetteSDF
6 年前
為了驗證表單,要「阻擋」像是單個空格或其他類似的輸入,我想到了這個組合:

function isEmpty($string){
$val = preg_replace('#[^A-Za-z0-9]+#', '', $string) ;
$val = trim($string, '');
return ($string=='') ;
}

這樣可以防止輸入像是:' '、' - '、'. - +' 等。對於姓名、職業等輸入欄位很有幫助。
ehsmeng
14 年前
我不能在所有情況下都使用 empty(),因為對我來說 '0' 通常不被視為空值。我針對最常見的測試方法做了一個快速的基準測試。 '' == var 的問題在於 '' == 0 為真,所以那只是為了好奇而做的。

<?php
$microtimeref
= microtime(true);
$a = 0;
$b = 'asd';
for (
$i = 0; $i < 5000000; $i++)
{
if (
0 == mb_strlen ($b))
{
$a++;
}
}
echo
"總計時間 0 == mb_strlen(var): <b>" . round(microtime(true) - $microtimeref,3) . 's</b><br />';
?>

結果

總計時間 0 == mb_strlen(var): 3.141s
總計時間 0 === strlen(var): 2.904s
總計時間 0 == strlen(var): 2.878s
總計時間 '' == var: 1.774s
總計時間 '' === var: 1.706s
總計時間 empty(var): 1.496s

因此 '' === var 將會是我的零長度字串測試方法。
phpsort
13 年前
我正在總結一些關於 empty() 與不可訪問屬性的重點,希望能幫其他人節省一些時間。使用 PHP 5.3.2。
<?php
class MyClass {
private
$foo = 'foo';
}
$myClass = new MyClass;
echo
$myClass->foo;
?>
如同預期,這會產生「致命錯誤:無法訪問私有屬性 MyClass::$foo」。
但將該行替換為
if (empty($myClass->foo)) echo 'foo is empty'; else echo 'foo is not empty';
我們會得到誤導性的結果「foo is empty」。
這裏沒有任何錯誤或警告,所以這是一個真正的陷阱。你的程式碼會靜默地出錯,我認為這相當於一個 bug。
如果你在類別中加入兩個魔術方法
public function __get($var) { return $this->$var; }
public function __isset($var) { return isset($this->$var); }
那麼我們就能得到預期的結果。你需要兩個方法都具備。
對於 empty($myClass->foo),我相信 PHP 會呼叫 __isset,如果結果為真,則回傳 __get 結果的 empty 判斷結果。(一些較早的文章錯誤地認為 PHP 只會回傳 __isset 的否定結果)。
但是…
請參考 php at lanar dot com 先前的文章。我確認了這些結果,如果你用 isset($x->a->b->c) 擴展測試,看起來 __isset 只會針對鏈中的最後一個屬性被呼叫。這也可以說是另一個 bug。empty() 的行為方式相同。所以事情並不像我們希望的那麼清楚。
另請參閱關於 empty() 的說明:
http://uk3.php.net/manual/en/language.oop5.overloading.php
真是令人費解!
mlibazisi mabandla
15 年前
在「0」不應被視為空值的情況下,以下是一個簡單的函式,可以安全地測試空字串(或混合變數):

<?php
function _empty($string){
$string = trim($string);
if(!
is_numeric($string)) return empty($string);
return
FALSE;
}
?>
wranvaud at gmail dot com
7 年前
請注意,如果你的變數只包含「換行字元」(即回車),PHP_EOL,它不會被視為空值。由於換行字元不總是容易被發現,這可能會造成混淆。
paul at worldwithoutwalls dot co dot uk
20 年前
請注意關於十進位數字的例外情況

<?php
$a
= 0.00;
$b = '0.00';
echo (empty(
$a)? "empty": "not empty"); //結果 empty
echo (empty($b)? "empty": "not empty"); //結果 not empty
//但是...
$c = intval($b);
echo (empty(
$c)? "empty": "not empty"); //結果 empty
?>

對於使用 MySQL 的人來說,如果你的表格有一個十進位類型的欄位,當你執行 SELECT 時,你的資料將以字串的形式返回,因此你需要在測試空值之前套用 intval()。

例如:
表格 t 有欄位 id MEDIUMINT 和 d DECIMAL(4,2)
並且包含 1 列,其中 id=1,d=0.00
<?php
$q
= "SELECT * FROM t";
$res = mysql_query($q);
$row = mysql_fetch_assoc($res);
echo (empty(
$row['d'])? "empty": "not empty"); // 結果:not empty
?>
匿名用戶
16 年前
補充匿名用戶的說法,john_jian 的例子看起來有些不尋常,因為我們沒有看到背後隱含的類型轉換。實際上發生的情況是:

$a = '';
$b = 0;
$c = '0';

(int)$a == $b -> true,因為任何非數字的字串都會被轉換為 0
$b==(int)$c -> true,因為字串中的整數會被轉換
以及
$a==$c -> false,因為它們是以字串而不是整數進行比較。(int)$a==(int)$c 應該會返回 true。

注意:我不記得 PHP 是否*有*類型轉換,更不用說這是否是正確的語法。我只是用一些東西來舉例說明。
denobasis-bozic et yahoo.com
15 年前
測試所有多維陣列是否為空

<?php
function is_multiArrayEmpty($multiarray) {
if(
is_array($multiarray) and !empty($multiarray)){
$tmp = array_shift($multiarray);
if(!
is_multiArrayEmpty($multiarray) or !is_multiArrayEmpty($tmp)){
return
false;
}
return
true;
}
if(empty(
$multiarray)){
return
true;
}
return
false;
}

$testCase = array (
0 => '',
1 => "",
2 => null,
3 => array(),
4 => array(array()),
5 => array(array(array(array(array())))),
6 => array(array(), array(), array(), array(), array()),
7 => array(array(array(), array()), array(array(array(array(array(array(), array())))))),
8 => array(null),
9 => 'not empty',
10 => "not empty",
11 => array(array("not empty")),
12 => array(array(),array("not empty"),array(array()))
);

foreach (
$testCase as $key => $case ) {
echo
"$key is_multiArrayEmpty= ".is_multiArrayEmpty($case)."<br>";
}
?>

輸出結果
========

0 is_multiArrayEmpty= 1
1 is_multiArrayEmpty= 1
2 is_multiArrayEmpty= 1
3 is_multiArrayEmpty= 1
4 is_multiArrayEmpty= 1
5 is_multiArrayEmpty= 1
6 is_multiArrayEmpty= 1
7 is_multiArrayEmpty= 1
8 is_multiArrayEmpty= 1
9 is_multiArrayEmpty=
10 is_multiArrayEmpty=
11 is_multiArrayEmpty=
12 is_multiArrayEmpty=
fahimcseiiuc at gmail dot com
5 年前
<?php

/*"" (空字串)
0 (整數 0)
0.0 (浮點數 0)
"0" (字串 0)
NULL
FALSE
array() (空陣列)*/

$anEmptyString = "";
empty(
$anEmptyString);
if(empty(
$anEmptyString) == TRUE){
echo
"TRUE";
} else{
echo
"FALSE";
}
echo
"<hr>"; //換行

$anIntegerNumber = 0;
empty(
$anIntegerNumber);
if(empty(
$anIntegerNumber) == TRUE){
echo
"TRUE";
} else{
echo
"FALSE";
}
echo
"<hr>"; //換行

$aFloatNumber = 0.0;
empty(
$aFloatNumber);
if(empty(
$aFloatNumber) == TRUE){
echo
"TRUE";
} else{
echo
"FALSE";
}
echo
"<hr>"; //換行

$aZeroValuedString = "0";
empty(
$aZeroValuedString);
if(empty(
$aZeroValuedString) == TRUE){
echo
"TRUE";
} else{
echo
"FALSE";
}
echo
"<hr>"; //換行

$aNULL = NULL;
empty(
$aNULL);
if(empty(
$aNULL) == TRUE){
echo
"TRUE";
} else{
echo
"FALSE";
}
echo
"<hr>"; //換行

$aBooleanFALSE = FALSE;
empty(
$aBooleanFALSE);
if(empty(
$aBooleanFALSE) == TRUE){
echo
"TRUE";
} else{
echo
"FALSE";
}
echo
"<hr>"; //換行

$anEmptyArray = array();
empty(
$anEmptyArray);
if(empty(
$anEmptyArray) == TRUE){
echo
"TRUE";
} else{
echo
"FALSE";
}
echo
"<hr>"; //換行

?>
mcfogw at gmail dot com
8 年前
我在比較 `!` 和 `empty()` 的行為時,發現了一個未記載的行為。

就像強制轉型為布林值一樣,`empty()` 會在意 SimpleXML 物件是否由空標籤建立。

`empty(simplexml_load_string('<root />'))` 的結果是 TRUE

這個行為從 PHP 5.1.0~7 開始出現,在 5.0.x 版本中,結果是 FALSE

證明在此 => https://3v4l.org/74Tc4
Greg Hartwig
16 年前
來自 CodeXplorer 的 David
>> 使用 empty() 的唯一理由是為了程式碼可讀性。它與 IF/ELSE 檢查相同。
>> 所以,在實際應用中不必費心使用 EMPTY。

這是不正確的。empty() 在測試未定義的變數時不會產生警告,而簡單的布林值檢查則會。在正式環境中,警告通常會被關閉,但在開發環境中,它們通常是啟用的。

你可以用以下方式測試一個旗標:
<?php if ($flagvar) ... ?>
但如果 $flagvar 未設定,這可能會產生警告。

與其使用
<?php if (isset($flagvar) && $flagvar) ... ?>
你可以簡單地使用
<?php if (!empty($flagvar)) ... ?>

以提高可讀性且避免警告。
chris dot wisefool at gmail dot com
13 年前
請注意,當子鍵不存在,但父鍵存在且為字串類型時,檢查陣列子鍵的存在性,empty() 會返回 false。

例如:

<?php
$params
= array('search'=>'1');
empty(
$params['search']['filter']); # 返回 false
?>

根據文件(https://php.dev.org.tw/manual/en/language.types.string.php),這是正確的;在頁面下方有警告:「寫入超出範圍的偏移量會以空格填充字串。非整數類型會轉換為整數。」)我沒有收到警告,但也許這也是正確的……取決於字串到整數的轉換是否被視為「非法」:「非法偏移類型會發出 E_NOTICE。」

(也就是說,由於 $params['search'] 是一個字串,'filter' 下標會被轉換為 0,因此測試變成 empty($params['search'][0]),這顯然是 false),但它讓我感到困惑,以至於我錯誤地提交了一個錯誤報告(我已經關閉了)。
jmarbas at hotmail dot com
19 年前
如果 $var 為空(根據上面「空」的定義)並且 $var 未設定,empty($var) 將返回 TRUE。

我知道手冊「返回值」部分的說明已經反過來說明了這一點

「如果 var 具有非空和非零值,則返回 FALSE。」

但我當時的想法是「為什麼這個東西對未設定的變數返回 TRUE??? 」……哦,我現在明白了……它應該對未設定的變數返回 TRUE!!!

<?php
ini_set
('error_reporting',E_ALL);
ini_set('display_errors','1');
empty(
$var);
?>
e dot klerks at i-bytes dot nl
14 年前
要建立一個僅接受陣列的空函式,可以使用類型提示

<?php
// emptyArray :: [a] -> Bool

function emptyArray(array $xs){
return empty(
$xs);
}
?>

在您的程式碼中使用類型提示是一件好事,因為它可以更容易地推斷您的程式碼。此外,它還會自動記錄程式碼。
rodolphe dot bodeau at free dot fr
14 年前
請注意,如果 "0"(字串形式的零)、0(整數形式的零)和 -0(整數形式的負零)返回 true,則 "-0"(字串形式的負零(是的,我已經有一些客戶在表單欄位中寫入 -0))會返回 false。您需要在使用 empty() 函式測試變數之前進行類型轉換。

<?php
$var
= "-0";
echo empty(
$var); // 返回 false
$var = (int) $var; // 將 $var 轉換為整數
echo empty($vat); // 返回 true
?>
qeremy
12 年前
針對「致命錯誤:無法在寫入上下文中使用函式返回值...」的簡單解決方案

<?php
function _empty($val) { return empty($val); }
?>
rkulla2 at gmail dot com
17 年前
由於我不喜歡 empty() 將 0 和 "0" 視為空值(這很容易導致程式碼中的錯誤),而且它不處理空白字元,所以我建立了以下函式

<?php
function check_not_empty($s, $include_whitespace = false)
{
if (
$include_whitespace) {
// 使包含空白字元的字串也被視為空值
$s = trim($s);
}
return (isset(
$s) && strlen($s)); // 變數已設定且不是空字串 ''
}
?>

您可以直接使用 if (check_not_empty($var)) { // 它不是空值 } 來取代 if (!empty($var)) { // 它不是空值 }。

如果您希望僅包含空白字元(例如定位字元或空格)的字串被視為空值,請執行:check_not_empty($var, 1)

如果您要檢查字串是否為空值,請執行:!check_not_empty($var)。

因此,每當您想要檢查表單欄位是否存在且包含值時,只需執行:if (check_not_empty($_POST['foo'], 1))

不再需要執行 if (isset() && !empty()) =]
pm1625637 at gmail dot com
5 年前
請小心這個

<?php
$del
= '';
echo empty(
$del);
?>

輸出:1
EllisGL
17 年前
針對零值問題,我的做法如下:
if($val == '' && $val !== 0 && $val !== '0')
xzero at elite7hackers dot net
7 年前
請注意,`empty()` 遇到空位元組 (null byte) 時會返回 false。例如:

<?php
// 儲存到變數中,以便在較舊的 PHP 版本上運作
$null_byte = chr(0); // === \0

var_dump(
empty(
null),
empty(
$null_byte)
);
/**
* 結果:
*
* bool(true)
* bool(false)
*/
Javier Alfonso
8 年前
如果您測試陣列的元素(例如 $_POST['key']),它會測試該鍵是否存在,如果存在,則測試其值是否為空,且永遠不會發出警告。

對於不想測試傳入陣列元素會發生什麼情況的人,以下是我的測試和結果。

<?php
$a
= array();
$b = array('key');
$c = array('key' => false);
$d = array('key' => 'La verdad nos hace libres');

echo (empty(
$a['key'])?'A 為空':'A 不為空'), ' - ', (empty($b['key'])?'B 為空':'B 不為空'), ' - ', (empty($c['key'])?'C 為空':'C 不為空'), ' - ', (empty($d['key'])?'D 不為空':'D 不為空');
?>

結果如下:

A 為空 - B 為空 - C 為空 - D 不為空
thomas at thomasnoest dot nl
16 年前
關於以下自訂 `empty` 函式的注意事項

`function_exists()` 遇到語言建構時會返回 false,而 `empty` 是一個語言建構。
Lukas
2 年前
<?php

// empty() 與 isset() 的差異

$testCase = array(
1 => '',
2 => ' ',
3 => null,
4 => array(),
5 => false,
6 => true,
7 => '0',
8 => 0,
);

foreach (
$testCase as $k => $v) {
echo
"<br> $k => " . strval($v) . " " . (empty($v) ? "是空的" : "不是空的") . " / " . (isset($v) ? "已設定" : "未設定");
}

/*
結果:
1 => 是空的 / 已設定
2 => 不是空的 / 已設定
3 => 是空的 / 未設定
4 => Array 是空的 / 已設定
5 => 是空的 / 已設定
6 => 1 不是空的 / 已設定
7 => 0 是空的 / 已設定
8 => 0 是空的 / 已設定
*/
To Top