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递归数组相交键触发字符串值的主要内容,如果未能解决你的问题,请参考以下文章