Существует ли функциональный способ удаления повторяющихся элементов в многомерном массиве в Stack Overflow

Есть ли функциональный путь к следующему?

Я хотел использовать 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]];

0

Решение

В случае, если вы просто хотите обернуть его в 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);
?>
2

Другие решения

Вы можете использовать функцию ссылки и функцию закрытия анонимных функций.

$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);

http://php.net/manual/en/functions.anonymous.php

1

По вопросам рекламы [email protected]