【问题标题】:Merge two associative array and delete the duplicate one合并两个关联数组并删除重复的
【发布时间】:2014-06-02 06:36:38
【问题描述】:

我有两个关联的键值对数组。我想将它合并成一个,这样它们的键仍然存在,并且第一个数组中具有“on_time”的值应该忽略第二个数组中该键的值。

这是我下面的两个数组

[att] => Array
        (
            [841] => on_time
            [842] => not_time
            [843] => not_time
        )

    [entatt] => Array
        (
            [841] => unexcused
            [842] => unexcused
            [843] => late
        )

我正在寻找的预期输出是

[entatt] => Array
    (
        [841] => on_time
        [842] => unexcused
        [843] => late
    )

有什么帮助吗?

【问题讨论】:

  • what have you tried?你看过array_merge吗?
  • 是的,使用 array_merge 我失去了钥匙。我不想这样做
  • @MarkBaker:根据相同的文档:“但是,如果数组包含数字键,则后面的值不会覆盖原始值,而是会被追加。”
  • 即使 array_merged 在数字键时没有附加值,它仍然不会按照他的要求进行操作

标签: php arrays


【解决方案1】:

这应该可行:

$result = array();
foreach ($att as $key => $value) {
    $result[$key] = $value !== 'on_time' ? $entatt[$key] : 'on_time';
}

【讨论】:

    【解决方案2】:

    您正在寻找一种方法来一次遍历两个数组,并在发生碰撞时应用一个选择正确条目的函数。我认为没有内置函数。

    function merge2($att, $entatt, $collision){
       $res = $att;
       foreach ($entatt as $key => $value) {
         if (isset($res[$key]))
           $res[$key] = $collision($res[$key],$value);
         else
           $res[$key] = $value;
       }
       return $res;
    }
    

    您应该可以按如下方式使用它:

    merge2($att,$entatt,function($v1,$v2){
       return $v1 !== 'on_time' ? $v2 : $v1;
    });
    

    它应该正确处理$entatt$att 包含不在另一个数组中的键的情况(尽管您的问题中并不清楚这是否必要)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 2021-10-20
      • 2011-11-18
      • 2010-12-07
      相关资源
      最近更新 更多