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, ако стойността е нула. използвайте 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
Благодаря ти Bulk, взех отговора на Jordy, който работи перфектно! Благодаря! - 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