使用另一个具有混合键的数组过滤和更新具有混合键的数组

问题描述 投票:0回答:3

我有两个数组。

$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)
);
  • 仅使用 $arr2 中的元素(也存在于 $arr1 中)
  • 每个元素的属性被合并
  • 如果公共元素(例如邮政编码)共享属性(例如隐藏),则 $arr2 中的属性优先

有哪些好的方法可以解决这个问题?

我试图把一些东西绊在一起......欢迎批评:**

$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];
        }
    }
}
php arrays multidimensional-array filter replace
3个回答
2
投票

你很接近

$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


0
投票

您所描述的逻辑似乎是:

  • 保留第一个数组的索引值,并将其作为第二个数组的索引值,并且
  • 用第二个数组的相应子数组覆盖第一个数组中关联值的子数组元素。

尚不清楚/未知关联元素是否可能没有子数组,因此这没有内置到下面的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);

-2
投票

你可能会发现 array_intersect() 很有用

链接文字

© www.soinside.com 2019 - 2024. All rights reserved.