PHP is_null:只有布尔值true和false,甚至不是null?

时间:2012-09-18 12:32:10

标签: php boolean isnull

跟进此question and answer,我决定仅接受布尔值true和false,并且甚至null来自其他开发者/用户的输入。

$default = array(
    "category_id"   =>  null,
    "category"      =>  false,
    "randomise"     =>  false
);

$config = array(
    "category_id"   =>  17,
    "randomise"     =>  false, 
    "category"      =>  null
);

function process_array($default,$config)
{
    # Set empty arrays for error & items.
    $error = array();
    $items = array();

    # Loop the array.
    foreach($default as $key => $value)
    {
        if (is_bool($default[$key]) && isset($config[$key])) 
        {
            if ($config[$key] === null) $error[] = '"'. $key.'" cannot be null.';

            # Make sure that the value of the key is a boolean.
            if (!is_bool($config[$key])) 
            {
                $error[] = '"'. $key.'" can be boolean only.';
            }

        }

            if(isset($config[$key]) && !is_array($value))
            {
                $items[$key] = $config[$key];
            }
            elseif(isset($config[$key]) && is_array($value))
            {
                $items[$key] = array_merge($default[$key], $config[$key]);
            }
            else
            {
                $items[$key] = $value;
            }
        }

        # Give a key to the error array.
        $error = array("error" => $error);

        # Merge the processed array with error array.
        # Return the result.
        return array_merge($items,$error);
}

print_r(process_array($default,$config));

但我得到的结果是,

Array
(
    [category_id] => 17
    [category] => 
    [randomise] => 
    [error] => Array
        (
        )

)

我追求的结果,

Array
(
    [category_id] => 17
    [category] => 
    [randomise] => 
    [error] => Array
        (
         [0] => "category" cannot be null.
        )

)

所以我认为下面的这一行应该有效,但我不明白为什么不行。我尝试使用is_null但仍无效。知道我做错了什么,我该如何解决这个问题?

if ($config[$key] === null) $error[] = '"'. $key.'" cannot be null.';

3 个答案:

答案 0 :(得分:3)

我认为null值不会通过isset()中的if (is_bool($default[$key]) && isset($config[$key]))测试,因此它会跳过整个块。

我认为你需要重构一下才能解决这个问题。如果将isset移出null测试,可能会把它取出来吗?

if (!isset($config[$key]) || is_null($config[$key])) $error[] = '"'. $key.'" cannot be null.';

答案 1 :(得分:2)

如果值为null,则

isset($config[$key])返回false。请改用array_key_existshttp://php.net/manual/function.array-key-exists.php)。

答案 2 :(得分:1)

null不会通过is_bool检查......据我所知 - 当涉及if statements时 - 最好尽可能简单:

if (is_null($default[$key]))
{
  $error[] = '"'. $key.'" cannot be null.';
}
else if (!is_bool($default[$key])) 
{
  $error[] = '"'. $key.'" can be boolean only.';
}

正如另一张海报所说,最好将上述内容包含在array_key_exists中,以避免非法偏移警告。 Tbh,为了简单起见,你真的需要这两种检查吗?指定key只能是布尔值就足够了。