簡體   English   中英

isset,array_key_exists和!empty的解決方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM