PHP - 通过混合数组循环

时间:2015-02-06 00:28:14

标签: php arrays

假设我有两个数组,一个是我需要的键,另一个是我要测试的数组。

在我需要的键数组中,每个键可能有一个值,它本身就是我需要的键数组,依此类推。

这是迄今为止的功能:

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。

这样做有什么好办法?

由于

3 个答案:

答案 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
        (
        )
)