假设我有两个数组,一个是我需要的键,另一个是我要测试的数组。
在我需要的键数组中,每个键可能有一个值,它本身就是我需要的键数组,依此类推。
这是迄今为止的功能:
static function keys_exist_in_array(Array $required_keys, Array $values_array, &$error)
{
foreach($required_keys as $key)
{
// Check required key is set in the values array
//
if (! isset($values_array[$key]))
{
// Required key is not set in the values array, set error and return
//
$error = new Error();
return false;
}
// Check the value is an array and perform function on its elements
//
if (is_array($values_array[$key]))
{
Static::keys_exist_in_array($required_keys[$key], $values_array[$key], $error);
}
return true;
}
}
我的问题是我要提交给$required_keys
的数组看起来像这样:
$required_keys = array(
‘key1’,
‘key2’,
‘key3’,
‘key4’ = array(
‘key1’,
‘key2’,
‘key3’ = array(
‘key1’
)
)
);
显然,此处的问题是foreach
只找到每个密钥,例如'key4',而不是没有自己价值的值,例如'key1','key2','key3'。
但如果我使用标准的for循环进行循环,我只得到值,key1,key2,key3。
这样做有什么好办法?
由于
答案 0 :(得分:1)
几个问题:
$key
是数组的元素,而不是键,所以你
一旦看到不匹配的元素,就不应该return false
,因为数组后面可能会有匹配的元素。相反,您应该在找到匹配后return true
。找到匹配后,您就不需要继续搜索了。
您需要先进行isarray()
测试,因为如果$key
是数组并且您尝试使用$values_array[$key]
,则会收到错误消息。它应该是isarray($key)
,而不是isarray($values_array[$key])
。
您需要测试递归调用的值。如果成功,您可以立即返回。
完成循环后,您应该只return false
找不到任何内容。
static function keys_exist_in_array(Array $required_keys, Array $values_array, &$error)
{
foreach($required_keys as $key)
{
// Check the value is an array and perform function on its elements
//
if (is_array($key))
{
$result = Static::keys_exist_in_array($required_keys[$key], $values_array[$key], $error);
if ($result) {
return true;
}
}
// Check required key is set in the values array
//
elseif (isset($values_array[$key]))
{
return true;
}
}
$error = new Error();
return false;
}
答案 1 :(得分:0)
如果您要求所有$ required_keys存在,则返回false是正确的操作,因为您希望它在找到丢失的密钥后立即停止查找。
static function keys_exist_in_array(Array $required_keys, Array $values_array, &$error)
{
foreach($required_keys as $key=>$value)
{
//check if this value is an array
if (is_array($value))
{
if (!array_key_exists($key, $values_array)
|| !Static::keys_exist_in_array($value, $values_array[$key], $error);){
$error = new Error();
return false;
}
}
// Since this value is not an array, it actually represents a
// key we need in the values array, so check if it is set
// in the values array
elseif (!array_key_exists($value, $values_array))
{
// Required key is not set in the values array, set error and return
$error = new Error();
return false;
}
}
//All elements have been found, return true
return true;
}
答案 2 :(得分:0)
将数组转换为键=>值数组,其值为#34;键"没有价值。
$arr = [
'a',
'b' => ['foo' => 1, 'bar' => 'X'],
'c' => ['baz' => 'Z'],
'd'
];
$res = [];
$keys = array_keys($arr);
$vals = array_values($arr);
foreach ($vals as $i => $v) {
if (is_array($v)) {
$res[$keys[$i]] = $v;
} else {
$res[$v] = [];
}
}
print_r($res);
结果:
Array
(
[a] => Array
(
)
[b] => Array
(
[foo] => 1
[bar] => X
)
[c] => Array
(
[baz] => Z
)
[d] => Array
(
)
)