![](/img/trans.png)
[英]php array_key_exists, !empty and isset fails for no reason?
[英]Workaround for isset, array_key_exists and !empty
在編寫php時,我盡量避免使用盡可能多的警告。 關於數組,有一個問題讓我困擾了很長一段時間。
在處理數組及其值時,我經常在進入“實際工作”之前檢查空值。
if(array_key_exists('bla', $array){
if( !empty($array['bla']) {
# do something
}
}
我的問題是:
這是很多代碼,只是檢查我是否有值可以使用。 是否有一些更短的方法來檢查數組中可能存在或不存在的值?
除非你確定這是你想要的,否則不要使用empty
:
如果
var
存在且具有非空的非零值,則返回FALSE
。 否則返回TRUE
。以下內容被認為是空的:
""
(空字符串)0
(0為整數)0.0
(0作為浮點數)"0"
(0作為字符串)NULL
FALSE
array()
(一個空數組)$var;
(聲明的變量,但沒有值)
手冊沒有明確列出“如果var
不存在”的情況,但這里有一對:
$array['undeclaredKey']
(現有數組,但未聲明鍵) $undeclaredVar;
(未聲明的變量) 通常, array_key_exists
檢查應該足夠了。
你可以干脆做
if (!empty($array['bla']) {
# do something
}
我一直在drupal中使用它,並且是檢查是否可用並避免任何類型警告的好方法。
做就是了:
if (!empty($array['bla'])) {
如果密鑰不存在,則不會發出警告。
不確定為什么還沒有人提到,但你可以這樣做:
// Before
if(array_key_exists('bla', $array){
if( !empty($array['bla']) {
// After (if element of array is scalar)
// Avoids warning and allows for values such as 0
if ((true === isset($array['bla'])) && (mb_strlen($array['bla']) > 0)) {
// After (if element of array is another array
// Avoids warning and ensures element is populated
if ((true === isset($array['bla'])) && (count($array['bla']) > 0)) {
如果你真的想用更好的方法檢查vars,你可以創建一個標准化的API,下面是我創建的一些方法,以避免變量檢查的清單函數調用:
class MyString
{
public static function populated($string)
{
//-----
// Handle various datatypes
//-----
// Don't want to assume an array as a string, even if we serialize then check
if (is_array($string)) {
return false;
}
if (is_object($string)) {
if (!is_callable(array($string, '__toString'))) {
return false;
}
$string = (string) $string;
}
//-----
return (mb_strlen($string) > 0) ? true : false;
}
}
class MyArray
{
public static function populatedKey($key, $array, $specificValue = null, $strict = true)
{
if ((is_array($array)) &&
(array_key_exists($key, $array))) {
if (is_array($array[$key])) {
return (count($array[$key]) > 0) ? true : false;
}
elseif (is_object($array[$key])) {
return true;
}
elseif (mb_strlen($array[$key]) > 0) {
if (!is_null($specificValue)) {
if ($strict === true) {
return ($array[$key] === $specificValue) ? true : false;
} else {
return ($array[$key] == $specificValue) ? true : false;
}
}
return true;
}
}
return false;
}
}
// Now you can simplify calls
if (true === MyArray::populatedKey('bla', $array)) { // Do stuff }
if (true === MyString::populated($someString)) { // Do stuff }
有1K方法可以對貓進行換膚,但是標准化這樣的調用會增加快速應用程序開發(RAD),使調用代碼保持干凈,並有助於自我文檔(語義邏輯)。
如果要檢查非空值,則可以使用!empty($array['bla'])
。
您還可以使用isset($array['bla'])
,它在以下情況下返回false
:1)未定義鍵或2)如果為鍵存儲的值為null
。 檢查數組是否包含鍵(即使其值為null)的唯一簡單方法是使用array_key_exists()
。
即使鍵存在(行為類似於isset()
),對empty()
的調用也是安全的,因此您不必通過array_key_exists()
來保護它。
我很驚訝這沒有提到,但是使用錯誤控制操作符的最短路徑獲取密鑰的值而不產生警告/錯誤:
// safely fetch from array, will return NULL when key doesn't exist
$value = @$array['bla'];
這允許您獲取任何鍵的值,如果鍵不存在,則返回值的可能性為null
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.