筛选关联行数组以仅保留指定列中具有唯一值的行


Filter array of associative rows to retain only rows with unique value in specified column

我有以下数组:

$array = [  
    ['id' => 1, 'code' => '342'],
    ['id' => 2, 'code' => '765'],
    ['id' => 3, 'code' => '134'],
    ['id' => 1, 'code' => '999'],
];

这里的Array[0]['id']Array[3]['id']是关于['id']的重复项。我想删除其中一个(哪个都没关系)。

实际上,我认为我找到了使用此代码的解决方案:

//data
$row = $stmt->fetchALL(PDO::FETCH_ASSOC); 
$ids = array();
for($i = 0;$i < count($row); $i++ )
{
    if (in_array($row[$i]['id'], $ids))
        {
            unset($row[$i]);
            continue;
        }
    $ids[] = $row[$i]['id'];
}
print_r($row);

出于某种原因,它适用于小数组,但是如果我有很多值并且有多个重复项,它会失败。对我错过了什么有什么建议吗?

使用常规foreach循环的简单解决方案:

$rows = [
    ['id' => 1, 'code' => '342'],
    ['id' => 2, 'code' => '765'],
    ['id' => 3, 'code' => '134'],
    ['id' => 1, 'code' => '342']
];
$ids = [];
foreach ($rows as $k => $item) {
    if (in_array($item['id'], $ids)){
         unset($rows[$k]);            
    } else {
         $ids[] = $item['id'];
    }    
}
print_r($rows);

我认为这可以不循环完成。让我举一个例子:

$rows = array (
    array ('id' => 1, 'code' => '342'),
    array ('id' => 2, 'code' => '765'),
    array ('id' => 3, 'code' => '134'),
    array ('id' => 1, 'code' => '342')
);
$input = array_map("unserialize", array_unique(array_map("serialize", $rows)));
echo '<pre>';
print_r($input);

输出:

 Array
 (
  [0] => Array
    (
        [id] => 1
        [code] => 342
    )
  [1] => Array
    (
        [id] => 2
        [code] => 765
    )
  [2] => Array
    (
        [id] => 3
        [code] => 134
    )
  )

我想删除其中一个(哪个都没关系)。

好的,使用 array_column() 通过 id 值分配临时第一级键。 因为 PHP 不允许同一级别的两个元素共享同一个键,所以每个后续重复项都会覆盖前面遇到的行。 将该调用包装在array_values()以删除临时键(重新索引数组)。

代码:(演示)

var_export(
    array_values(array_column($rows, null, 'id'))
);

输出:

array (
  0 => 
  array (
    'id' => 1,
    'code' => '999',
  ),
  1 => 
  array (
    'id' => 2,
    'code' => '765',
  ),
  2 => 
  array (
    'id' => 3,
    'code' => '134',
  ),
)