PHP-在混合数组中循环
假设我有两个数组,一个是我需要的密钥,另一个是我想测试的数组 在我需要的键数组中,每个键可能都有一个值,该值本身就是我需要的键数组,依此类推 以下是迄今为止的功能:PHP-在混合数组中循环,php,arrays,Php,Arrays,假设我有两个数组,一个是我需要的密钥,另一个是我想测试的数组 在我需要的键数组中,每个键可能都有一个值,该值本身就是我需要的键数组,依此类推 以下是迄今为止的功能: static function keys_exist_in_array(Array $required_keys, Array $values_array, &$error) { foreach($required_keys as $key) { // Check requir
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\u keys
的数组可能如下所示:
$required_keys = array(
‘key1’,
‘key2’,
‘key3’,
‘key4’ = array(
‘key1’,
‘key2’,
‘key3’ = array(
‘key1’
)
)
);
显然,这里的问题是,foreach
只查找每个键,例如“key4”,而不是没有自身值的值,例如“key1”、“key2”、“key3”
但是如果我使用标准for循环进行循环,我只得到值,key1,key2,key3
有什么更好的方法
谢谢你,有几个问题:
$key
是数组的元素,而不是键,因此
当看到不匹配的元素时,不应立即返回false,因为数组中稍后可能会有匹配的元素。相反,只要找到匹配项,就应该返回true
。一旦找到匹配项,就不需要继续搜索
您需要首先执行isarray()
测试,因为如果$key
是一个数组,并且尝试使用$values\u数组[$key]
,则会出现错误。它应该是isarray($key)
,而不是isarray($values\u array[$key])
您需要测试递归调用的值。如果成功,您可以立即返回
只有在完成循环且未找到任何内容后,才应返回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;
}
如果您要求所有$required_密钥都存在,那么在这里返回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;
}
将数组转换为key=>value数组,其中没有值的“key”的值为空
$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
(
)
)
循环时,检查值是否是数组,如果是,则在循环内再次调用函数并传递值(数组)。检查元素的类型,如果是数组,则在该元素上递归!如上所述,问题在于循环。Foreach只提供键,Foreach只提供值。我需要在一个循环中同时使用这两个函数…第18-21行是递归函数为什么需要这两个函数key1
、key2
等都是值。您的数组很奇怪:为什么它是索引数组和关联数组的混合体?