PHP递归数组相交键触发字符串值

Posted

技术标签:

【中文标题】PHP递归数组相交键触发字符串值【英文标题】:PHP Recursive Array Intersect Key Tripping over string value 【发布时间】:2013-04-18 21:09:59 【问题描述】:

我在尝试递归地与多维数组(灰/白名单)相交时收到错误 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
        )

)

【问题讨论】:

先检查它的数组 好吧 - 你不检查第二个参数:$array2[$key] - 这也应该是一个数组 @Adidi 请将其作为答案发布,以便我接受 =) 这就是问题所在! 【参考方案1】:

因为您使用的是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;

【讨论】:

【参考方案2】:

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

【讨论】:

干杯,感谢您指出这一点。它通常是小东西=/

以上是关于PHP递归数组相交键触发字符串值的主要内容,如果未能解决你的问题,请参考以下文章

相交键后的PHP数组排序关联键

PHP 使用字符串作为数组键模式

php数组键中允许的字符?

我无法与数组相交。 POST,PHP,如何与 POST 数组相交?

PHP中如何对二维数组按某个键值进行排序

如果值递归包含字符串,Ruby 返回***哈希键