首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -检查所需键的数组并设置可选的键值

问PHP -检查所需键的数组并设置可选的键值
EN

Stack Overflow用户
提问于 2015-02-06 22:39:23
回答 5查看 3.2K关注 0票数 0

我正在构建一个web API,它接受一组数据。我想检查此数组中是否有某些键,如果所需的键不存在,则返回false;如果可选键不存在,则在数组中设置该键-值对。

造成混淆的原因是我的输入数组可能将数组作为值。例如,假设我输入的数组如下所示:

代码语言:javascript
复制
$input_array = array(
    ’name’ => ‘Adam’,
    ‘address’ => array(
        ‘number’ => 12,
        ‘street’ => ‘My Street’
    )
);

我有必需的密钥:

代码语言:javascript
复制
$required_keys = array(
    ‘name’,
    ‘address’ => array(
        ‘number’,
        ‘street’
    )
);

可选键:

代码语言:javascript
复制
$optional_keys = array(
    ‘address’ = array(
        ‘postcode’ => ‘WA1'
    )
);

我正在努力找到一种方法来针对这两种类型的测试数组(输入和可选)来测试我的输入数组。

应该发生的情况是: 1)所有必需的密钥都应该匹配。2)如果任何可选键不存在,则将它们设置为可选键数组中的键值对。

我知道(但没有经验)正则表达式。但是,我知道PHP有一个名为http_build_query(mixed $array);的函数,它接受一个数组并将其转换为URL查询字符串。我的想法是,也许我可以将输入数组转换为URL字符串,然后将其与由两个测试数组(必需和可选)组成的正则表达式进行比较。这行得通吗?

如果有人有其他的想法,我很想知道。谢谢

更新:附加的非可疑输出

​

​

更新2:附加新输出

​

​

更新3:当前代码:

代码语言:javascript
复制
static public function static_test_required_keys(Array $required_keys_array, Array $input_array)
{
    $missing = array();

    foreach ($required_keys_array as $key => $value)
    {
        if (empty($input_array[$key]))
        {
            $missing[] = $key;
        }
        else if (isset($input_array[$key]) && is_array($input_array[$key]))
        {
            $missing = array_merge(Inputter::static_test_required_keys($value, $input_array[$key]), $missing);
        }
    }

    return $missing;
}

更新4:新代码。

代码语言:javascript
复制
tatic public function static_test_required_keys(Array $required_keys_array, Array $input_array)
{
    $missing = array();

    foreach ($required_keys_array as $key => $value)
    {
        if (! isset($input_array[$key]))
        {
            $missing[] = $key;
        }
        else if (isset($input_array[$key]) && is_array($input_array[$key]))
        {
            $missing = array_merge(Inputter::static_test_required_keys($value, $input_array[$key]), $missing);
        }
    }

    return $missing;
}

已将代码从isempty()更改为isset()。这一页给出了两者之间的区别。https://www.virendrachandak.com/techtalk/php-isset-vs-empty-vs-is_null/

EN

回答 5

Stack Overflow用户

发布于 2015-02-06 22:50:04

具有对称input+required密钥的新改进版本...

代码语言:javascript
复制
$input_array = array(
    'name' => 'Adam',
    'address' => array(
        'number' => 12,
        'street' => '',
        'phones' => array('home_phone'=>'','fax'=>'555-1212')
    )
);

$required_keys = array(
    'name' => '',
    'address' => array(
        'number' => '',
        'street' => '',
        'phones' => array('home_phone'=>'')
    )
);


function check_required( $input, $required ){
    $missing = array();
    foreach ($required as $k=>$v) {
        if (empty($input[$k])) {
            $missing[] = $k;
        } else if (is_array($v)) {
            $missing = array_merge( check_required( $input[$k], $v ), $missing );
        }
    }
    return $missing;
}

$missing = check_required( $input_array, $required_keys );
if (!empty($missing)) echo 'Please enter your '. implode(', ', $missing);

请在此处查看沙箱... http://sandbox.onlinephpfunctions.com/code/23b908b873b053aefb37770f636b63bba2db960b

票数 1
EN

Stack Overflow用户

发布于 2015-02-06 22:58:49

必填字段

您可以使用array_diff检查输入中是否缺少任何必填字段。

可选字段

您可以使用array_merge为缺少的字段设置默认值。

代码

代码语言:javascript
复制
$requiredKeys = [
   'foo',
   'baz',
];

// Take the keys from input
$inputKeys = array_keys($input);

$missingRequiredKeys = array_diff($requiredKeys, $inputKeys)
if (!empty($missingRequiredKeys)) {
    throw new InvalidArgumentException(...);
}

// Setup default values for missing optional keys
$defaultValues = [
   'bar' => 'bas',
];

$result = array_merge($defaultValues, $input);

子数组

对于选中必填字段或设置默认值,需要在各个函数中重复上面的代码。

代码语言:javascript
复制
function validateInput(array $input) {
   // Above code

   // Validate field subkeys from a parent required field.
   // or optional field with default value.
   validateFoo($input['foo']);

   // Validate field subkeys from a parent optional field without default value.
   if (array_key_exists('optional_input_without_default', $input)) {
       validateAnotherFooInput($input['optional_input_without_default']);
   }
}

其他选项

您可以通过多种方式使用数组交集、比较和合并来检查Array Book中的那些函数族

array_diff_assoc -使用额外的索引检查计算数组之间的差异

array_diff_key -使用键进行比较来计算数组的差异

array_diff_uassoc -使用由用户提供的回调函数执行的附加索引检查来计算数组之间的差异

array_diff_ukey -使用键上的回调函数计算数组的差值以进行比较

array_diff -计算数组的差

array_intersect_assoc -使用额外的索引检查来计算数组的交集

array_intersect_key -使用键计算数组的交集以进行比较

array_intersect_uassoc -使用额外的索引检查计算数组的交集,通过回调函数比较索引

array_intersect_ukey -使用键上的回调函数计算数组的交集以进行比较

array_intersect -计算数组的交集

array_udiff_assoc -使用额外的索引检查计算数组之间的差异,通过回调函数比较数据

array_udiff_uassoc -使用额外的索引检查计算数组的差异,通过回调函数比较数据和索引

array_udiff -通过使用回调函数进行数据比较来计算数组之间的差异

array_uintersect_assoc -使用额外的索引检查计算数组的交集,通过回调函数比较数据

array_uintersect_uassoc -使用额外的索引检查计算数组的交集,通过回调函数比较数据和索引

array_uintersect -计算数组的交集,通过回调函数比较数据

票数 1
EN

Stack Overflow用户

发布于 2015-02-06 22:55:15

代码语言:javascript
复制
// Check if required keys exist
foreach( $required_keys as $req_key => $req_val )
{
    if( !array_key_exists( $req_key, $input_array )
    {
        // if key exists check if it has values set in an array and if 
        // these are also in $input_array
        if( is_array( $req_val ) )
        {
            foreach( $req_val as $inner_req_key )
            {
                if( !isset( $input_array[$req_val][$inner_req_key] )
                {
                    echo "Required key '$req_key' is missing value '$inner_req_key'.";
                }
            }
        }
        echo "Required key '$req_key' is missing.";
    }
}

// Check if optional keys are defined
foreach( $optional_keys as $opt_key => $opt_val )
{
    // Check if key exists, if not copy optional key=>value as whole
    if( !array_key_exists( $opt_key, $input_array )
    {
        $input_array[ $opt_key ] = $opt_val;
    }
    else // key exists
    {
        // if key exists check if it is an array and if optional elements
        // exist, else add them
        if( is_array( $opt_key ) )
        {
            foreach( $opt_key as $inner_opt_key => $inner_opt_val )
            {
                // key is not set, so get from %optional_keys
                if( !isset( $input_array[$opt_key][$inner_opt_key] )
                {
                    $input_array[$opt_key][$inner_opt_key] = $inner_opt_val;
                }
            }
        }
    }
}

很久没有PHP了,但这可能会有帮助。PS:没有经过测试,并添加了一些解释。HTH

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28368194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档