Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php isset、数组\u密钥\u的解决方法存在并且!空的_Php_Arrays - Fatal编程技术网

Php isset、数组\u密钥\u的解决方法存在并且!空的

Php isset、数组\u密钥\u的解决方法存在并且!空的,php,arrays,Php,Arrays,在编写php代码时,我尽量避免警告。有一个问题困扰了我很长一段时间,关于数组 在处理数组及其值时,我通常先检查空值,然后再开始“实际工作” 我的问题是: 这是很多代码,用于检查我是否有值可以使用。是否有较短的方法检查数组中可能存在或不存在的值 只要做: if (!empty($array['bla'])) { 如果密钥不存在,则不会出现警告。除非您确定这是您想要的,否则不要使用: 如果var存在且具有非空、非零值,则返回FALSE。否则返回TRUE 以下内容被认为是空的: ”(空字符串) 0

在编写php代码时,我尽量避免警告。有一个问题困扰了我很长一段时间,关于数组

在处理数组及其值时,我通常先检查空值,然后再开始“实际工作”

我的问题是:

这是很多代码,用于检查我是否有值可以使用。是否有较短的方法检查数组中可能存在或不存在的值

只要做:

if (!empty($array['bla'])) {
如果密钥不存在,则不会出现警告。

除非您确定这是您想要的,否则不要使用:

如果
var
存在且具有非空、非零值,则返回
FALSE
。否则返回
TRUE

以下内容被认为是空的:

  • (空字符串)
  • 0
    (0为整数)
  • 0.0
    (0作为浮点数)
  • “0”
    (0作为字符串)
  • NULL
  • FALSE
  • array()
    (空数组)
  • $var(声明了一个变量,但没有值)
本手册没有明确列出“如果
var
不存在”的情况,但这里有几个:

  • $array['undeclaredKey']
    (现有数组,但未声明键)
  • $undeclaredVar(未声明变量)

通常
数组\u键\u存在
检查就足够了。

不确定为什么还没有人提到isset,但您可以这样做:

// 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)) {
如果你真的想用更好的方法检查变量,你可以创建一个标准化的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),保持调用代码的干净性,并有助于编写自我文档(语义逻辑)。

您只需简单地执行即可

if (!empty($array['bla']) {
 # do something
}

我在drupal中一直使用它,这是检查是否可用并避免任何警告的好方法。

如果您检查的是非空值,那么您可以使用
!空($array['bla'])

您还可以使用
isset($array['bla'])
,在以下情况下返回
false
:1)未定义键,或2)如果为键存储的值为
null
。检查数组是否包含键(即使其值为null)的唯一简单方法是使用
array\u key\u exists()

即使密钥存在,对
empty()
的调用也是安全的(其行为类似于
isset()
),因此您不必通过
array\u key\u exists()
来保护它

我很惊讶没有提到这一点,但获取密钥值而不生成警告/错误的最短方法是使用:


这允许您获取任何键的值,如果该键不存在,其返回值可能为
null

非常确定您所需要的只是一个不会抛出警告的子句:
确定变量是否被视为空。如果变量不存在或其值等于FALSE,则认为该变量为空。如果变量不存在,empty()不会生成警告。
。。。或者如果键确实存在,但值为false。这包括
“0”
。对不起,但是我的-1:
空的
很少适用于目的。@LightnessRacesinOrbit这不是问题所在。如果
empty
符合OP的条件要求,则由OP决定。事实上,他已经在使用它了。这并不意味着他应该这样做,也不意味着它做了他想要的<代码>仅用于检查是否有值可使用
意味着没有。字符串
“0”
,对于大多数人来说,是一个非常合理且现存的值,当然也不是一个很好的标准,用来表示具有此值的数组元素“根本不存在”。是的,尝试捕捉“else”的情况不会带来任何结果,例如,为用户生成错误消息…@Tom:你是什么意思“不会产生任何结果”?当0是一个合法值时,这让我感到有些困惑,例如使用布尔值来指示对象是否处于活动状态。对于未定义的数组键和未定义的变量,也会在不通知的情况下返回true,这与OP的问题有关。@dualmon:引号的第一行表示(如果巧妙的话)。;)但是,手册没有列出它们,是真的(很明显,这不是一个详尽的列表-只是演示了实际存在的变量如何仍然会导致
空(x)==true
)。我调整了您的编辑,因为它破坏了PHP手册引用的正确性。您有没有弄明白?
if (!empty($array['bla']) {
 # do something
}
// safely fetch from array, will return NULL when key doesn't exist
$value = @$array['bla'];