我有以下数组:
$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',
),
)