跟进此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.';
答案 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)
isset($config[$key])
返回false。请改用array_key_exists
(http://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
只能是布尔值就足够了。