我有两个数组...
$arr1 = array(
'name',
'date' => array('default' => '2009-06-13', 'format' => 'short'),
'address',
'zipcode' => array('default' => 12345, 'hidden' => true)
);
$arr2 = array(
'name',
'language',
'date' => array('format' => 'long', 'hidden' => true),
'zipcode' => array('hidden' => false)
);
这是想要的结果:
$final = array(
'name',
'date' => array('default' => '2009-06-13', 'format' => 'long', 'hidden' => true),
'zipcode' => array('default' => 12345, 'hidden' => false)
);
有哪些好的方法可以解决这个问题?
提前致谢。
编辑:我试图把一些东西放在一起......欢迎批评:
$new_array = array_intersect_key($arr2, $arr1);
foreach ($new_array as $key => $val)
{
if (is_array($arr1[$key]))
{
if (is_array($val))
{
$new_array[$key] = array_merge($val, $arr1[$key]);
}
else
{
$new_array[$key] = $arr1[$key];
}
}
}
你很接近
$newArr = array_intersect_key($arr1, $arr2);
foreach ($newArr as $key => $val)
{
if (is_array($val))
{
$newArr[$key] = array_merge($arr1[$key], $arr2[$key]);
}
}
编辑 只需将 array_intersect 更改为 array_intersect_key
您所描述的逻辑似乎是:
尚不清楚/未知关联元素是否可能没有子数组,因此这没有内置到下面的sceipt中。 演示
$arr2List = array_filter(
$arr2,
is_int(...),
ARRAY_FILTER_USE_KEY
);
$result = [];
foreach ($arr1 as $k => $v) {
if (is_int($k)) {
if (in_array($v, $arr2List)) {
$result[] = $v;
}
} elseif (
is_array($v)
&& is_array($arr2[$k] ?? null)
) {
$result[$k] = array_replace($v, $arr2[$k]);
}
}
var_export($result);
你可能会发现 array_intersect() 很有用