2

この質問と回答のフォローアップとして、ブール値の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.';
4

3 に答える 3

3

null値は のisset()テストに合格しないと思われるif (is_bool($default[$key]) && isset($config[$key]))ため、ブロック全体をスキップしています。

これを解決するには、少しリファクタリングする必要があると思います。そのifからissetを取り出し、それをnullテストに移動しますか?

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

于 2012-09-18T12:41:02.797 に答える
2

isset($config[$key])値が null の場合は false を返します。代わりにarray_key_exists( http://php.net/manual/function.array-key-exists.php ) を使用してください。

于 2012-09-18T12:44:19.453 に答える
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不正なオフセットの警告を避けるために、上記を でラップすることも最善です。簡単にするために、これらのチェックの両方が本当に必要ですか? ブール値のみを指定keyするだけで十分です。

于 2012-09-18T12:44:43.937 に答える