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
等都是值。您的数组很奇怪:为什么它是索引数组和关联数组的混合体?