【问题标题】:PHP - merging arraysPHP - 合并数组
【发布时间】:2009-06-14 02:21:23
【问题描述】:

我有两个数组...

$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];
        }
    }
}

【问题讨论】:

  • 在这种情况下,好的做法是发布这样的代码作为您自己问题的答案。
  • 问题是上面的“解决方案”行不通……
  • 我正在查看此内容,但想知道是否存在轻微的不一致。你只关心匹配数组的第一维,然后合并第二维的所有内容,覆盖?此外,这是否会延伸到二维之外?
  • 这永远不会超过二维。是的,$arr1 元素的属性将被任何匹配的 $arr2 属性覆盖。
  • 我的更新解决方案现在应该修复

标签: php arrays merge


【解决方案1】:

你很亲密

$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

【讨论】:

  • 这看起来也不对。如果 $arr1['address'] 是一个数组,那么它仍然会到达最终输出... :\
  • 我并没有真正彻底检查它,它只是给了我正确的结果,所以我停止了:x。让我再看看。
【解决方案2】:

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

link text

【讨论】:

  • 我假设他知道这个函数,因为他的示例代码中包含了一个这样的子集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多