如何合并两个数组而不重复使用PHP中的某个值?

时间:2018-12-31 09:40:10

标签: php arrays

在PHP中,我有这两个数组,第一个是“ $ ar1”,第二个是“ $ ar2”:

Array
(
    [0] => stdClass Object
        (
            [id] => 1505
            [category] => blue
        )

    [1] => stdClass Object
        (
            [id] => 1805
            [category] => red
        )

)
Array
(
    [1777] => stdClass Object
        (
            [id] => 1505
            [category] => yellow
        )

    [1877] => stdClass Object
        (
            [id] => 1507
            [category] => blue
        )

)

我想将$ ar1添加到$ ar2,但前提是“ id”尚未在$ ar2中。 例如:ID为“ 1505”的ID不应添加到$ ar2。 这是我使用的代码:

$ ar3 = array_merge_recursive($ ar1,$ ar2);

4 个答案:

答案 0 :(得分:2)

可能不是最类似于php的代码(我想有一些数组函数可以做得更好),但是它可以正常工作:

$array1 = array(
    new Dummy(1505,"blue"),
    new Dummy(1805,"red")
);

$array2 = array(
    new Dummy(1505,"yellow"),
    new Dummy(1507,"blue")
);

$array3 = [];

foreach($array1 as $value)
{
    $array3[$value->id] = $value;
}

foreach($array2 as $value)
{
    if(!isset($array3[$value->id]))
    {
        $array3[$value->id] = $value;
    }
}

var_dump($array3);

我刚上过一个Dummy类,因为我想尽可能地接近您的数据。这使用映射的键(数组是PHP中的映射)作为主键。首先,您遍历始终设置的数组,然后遍历只有在尚未设置ID的情况下才应用到最终数组的数组->完成。打印:

array(3) { 
[1505]=> object(Dummy)#1 (2) { ["id"]=> int(1505) ["category"]=> string(4) "blue"}
[1805]=> object(Dummy)#2 (2) { ["id"]=> int(1805) ["category"]=> string(3) "red" } 
[1507]=> object(Dummy)#4 (2) { ["id"]=> int(1507) ["category"]=> string(4) "blue" } 
}

答案 1 :(得分:2)

一种可能性是,首先使用array_column$ar2中提取ID,然后使用array_filter

$ar2 = array( '1777' => (object) array('id' => '1505', 'category' => 'yellow'), '1877' => (object) array('id' => '1507', 'category' => 'blue'), );
$ids = array_column($ar1, 'id');
$ar3 = array_merge_recursive($ar1, array_filter($ar2, function($x) use ($ids) {
    return !in_array($x->id, $ids);
}));

print_r($ar3);

结果:

Array
(
    [0] => stdClass Object
        (
            [id] => 1505
            [category] => blue
        )

    [1] => stdClass Object
        (
            [id] => 1805
            [category] => red
        )

    [2] => stdClass Object
        (
            [id] => 1507
            [category] => blue
        )

)

Php demo

答案 2 :(得分:0)

尝试合并数组

array_merge($array1,$array2)

答案 3 :(得分:0)

尝试一下,功能来自此链接:http://php.net/manual/en/function.array-unique.php

$array1 = array(
                    array('id'=>'1505', 'category'=>'blue'),
                    array('id'=>'1805', 'category'=>'red')
                );

      $array2 = array(
                    array('id'=>'1505', 'category'=>'yellow'),
                    array('id'=>'1507', 'category'=>'blue')
                );
      $array3 = array_merge($array1, $array2);

      function unique_multidim_array($array, $key) { 
          $temp_array = array(); 
          $i = 0; 
          $key_array = array(); 

          foreach($array as $val) { 
              if (!in_array($val[$key], $key_array)) { 
                  $key_array[$i] = $val[$key]; 
                  $temp_array[$i] = $val; 
              } 
              $i++; 
          } 
          return $temp_array; 
      } 
      $details = unique_multidim_array($array3,'id');
      echo "<pre>";
      print_r($details);
      die;