PHP is_null: только логическое значение true и false, даже не null?

Следуя этому вопрос и ответ, я решил принять только логическое значение 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.';

person laukok    schedule 18.09.2012    source источник


Ответы (3)


isset($config[$key]) возвращает false, если значение равно null. используйте array_key_exists (http://php.net/manual/function.array-key-exists.php).

person passioncoder    schedule 18.09.2012

Я считаю, что значение null не пройдет тест isset() в if (is_bool($default[$key]) && isset($config[$key])), поэтому оно пропускает весь блок.

Я думаю, вам нужно будет немного реорганизовать, чтобы решить эту проблему. Может быть, взять isset из этого if и перенести его на нулевой тест?

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

person Dan Smith    schedule 18.09.2012
comment
Спасибо, Навальный, я взял ответ Джорди, который отлично работает! Благодарность! - person laukok; 18.09.2012

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 может быть только логическим значением.

person Pebbl    schedule 18.09.2012
comment
Спасибо за пояснение, pebbl. - person laukok; 18.09.2012