Есть ли функциональный путь к следующему?
Я хотел использовать array_filter, но не могу придумать, как создать массив $ ids_used в обратном вызове array_filter.
$data = [
[
'id' => 1,
'price' => 5,
],
[
'id' => 1,
'price' => 6,
]
];
$ids_used = [];
foreach($data as $index => $item)
{
if(in_array($item['id'], $ids_used)) {
unset($data[$index]);
}
else
{
$ids_used[] = $item['id'];
}
}
// expected output is: $data = [['id' => 1,'price' => 5]];
В случае, если вы просто хотите обернуть его в array_filter:
<?php
$data = [
[
'id' => 1,
'price' => 5,
],
[
'id' => 1,
'price' => 6,
]
];
$ids_used = [];
$filtered = array_filter($data, function($item) use (&$ids_used) {
if(!in_array($item['id'], $ids_used)) {
$ids_used[] = $item['id'];
return true;
} else {
return false;
}
});
var_dump($ids_used);
var_dump($filtered);
?>
Вы можете использовать функцию ссылки и функцию закрытия анонимных функций.
$ids_used = [];
$result = array_filter($data, function($item)use(&$ids_used)
{
if (in_array($item['id'], $ids_used))
{
return false;
}
else
{
$ids_used[] = $item['id'];
return true;
}
});
var_dump($result);