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