PHP递归数组相交键跳闸字符串值


PHP Recursive Array Intersect Key Tripping over string value

我目前收到一个错误PHP Catchable fatal error: Argument 2 passed to NUI::recArrInterKey() must be an array, string given时,试图递归相交多维数组(灰/白名单)。

它似乎在$foo['contact']['im']['provider']部分绊倒了,因为一些我不知道的原因?

这里是一个示例白名单数组($array2),我使用

Array
(
    [location] => false
    [network_name] => false
    [interests] => false
    [last_name] => false
    [url] => false
    [significant_other] => false
    [network_domains] => false
    [contact] => Array
        (
            [im] => Array
                (
                    [provider] => false
                )
            [email_addresses] => false
        )
)

方法

/**
 * Recursive array intersect key
 */
private static function recArrInterKey(array $array1, array $array2) 
{
    $array1 = array_intersect_key($array1, $array2);
    foreach ($array1 as $key => &$value) 
    {
        if (is_array($value)) 
        {
            $value = self::recArrInterKey($value, $array2[$key]);
        }
    }
    return $array1;
}

假设这是$array1

Array
(
    [location] => Seattle
    [occupation] => Developer
    [network_name] => foo.network
    [network_region] => foo.region
    [interests] => coding
    [last_name] => daniel
    [url] => false
    [id] => 4665228
    [significant_other] => some girl
    [network_domains] => false
    [contact] => Array
        (
            [im] => Array
                (
                    [provider] => aol
                )
            [phone] => Array
                (
                    [provider] => at&t
                )
            [email_addresses] => dont@mail.me
        )
)

我期待这是一个返回

Array
(
    [location] => Seattle
    [occupation] => Developer
    [network_name] => foo.network
    [interests] => coding
    [last_name] => daniel
    [url] => false
    [significant_other] => some girl
    [network_domains] => false
    [contact] => Array
        (
            [im] => Array
                (
                    [provider] => aol
                )
            [email_addresses] => dont@mail.me
        )
)

因为您使用的是array_intersect_key,它只比较键=> $array1[$key]可能有一个值作为数组,但不需要$array2[$key]

您的情况是单向相交:recArrInterKey($a1, $a2)recArrInterKey($a2, $a1)不相同

尝试修复:

private static function recArrInterKey(array $array1, array $array2) 
{
    $array1 = array_intersect_key($array1, $array2);
    foreach ($array1 as $key => &$value) 
    {
        if (is_array($value)) 
        {
            $value = is_array($array2[$key]) ? self::recArrInterKey($value, $array2[$key]) : $value;
        }
    }
    return $array1;
}

你不检查第二个参数:$array2[$key] -这也应该是一个数组