合并两个 2d 数组中的一列并删除重复项


Merge one column from two 2d arrays and remove duplicates

我正在运行两个查询,它们返回类似于如下所示的数组:

第一:

array(
    array(
        'id' => 1
    ),
    array(
        'id' => 2
    ),
    array(
        'id' => 3
    ),
    array(
        'id' => 4
    ),
)

第二:

array(
    array(
        'id' => 4
    ),
    array(
        'id' => 5
    ),
    array(
        'id' => 6
    ),
    array(
        'id' => 7
    ),
)

但我想以

$ids = array(1,2,3,4,5,6,7);

但我能想到的唯一方法是

$ids = array();
foreach(array($array1, $array2) as $a){
    foreach($a as $id){
        $ids[] = $id['id'];
    }
}
$ids = array_unique($ids);

但这对我来说似乎不是很有效,而且那里有丰富的数组函数,我想知道是否有更好的方法?

有几种方法可以解决这个问题。我想我可能会从两个原始数组上的array_merge()开始,然后用array_map()将其展平,最后调用array_unique()

// Combine them
$new = array_merge($array1, $array2);
// Flatten them
// array_map() is used to select the 'id' key from each
$new = array_map(function($a) { 
  return $a['id'];
}, $new);
// And get the unique values
$ids = array_unique($new);
print_r($ids);
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [5] => 5
    [6] => 6
    [7] => 7
)

更好:在一个查询中执行此操作。

看到查询后,这些不需要是两个数组。它可以通过单个UNION查询来完成。使用普通UNION而不是UNION ALL将为您删除重复数据。

SELECT
  game_id AS id
FROM user_game 
WHERE user_id = :userid
UNION
SELECT
  id
FROM games
WHERE referee_id = :userid OR reviewer_id = :userid
ORDER BY id

提取行时,由于您只有一列,因此可以考虑在读取中直接将其展平。

// For example
while ($row = $stmt->fetch()) {
  // Pluck only the id from the row fetched
  $ids[] = $row['id'];
}
// $ids is now a 1D array.

不确定这是否是您正在寻找的,但请尝试:

array_unique(array_merge($firstArr, $secndArr));

可能不是因为你的数组是关联的,但至少你可以跳过一些步骤。