Удалить дубликаты на основе определенного ключа

Получил многомерный массив как этот:

$A = array(
[0]=>
array(
["rel"]=> 4
["name"]=> "Bar"...
)
[1]=>
array(
["rel"]=> 2
["name"]=> "Bar"...
)
[2]=>
array(
["rel"]=> 1
["name"]=> "Foo"...
)
[3]=>
array(
["rel"]=> 5
["name"]=> "Bar"...
)
[4]=>
array(
["rel"]=> 4
["name"]=> "Tee"...
)
)

Я хочу удалить дубликаты на основе определенного ключа, сохраняя при этом исходную структуру массива, кроме ключей индекса.

Ради этого примера, скажем, я хочу удалить эти подмассивы с идентичным ключом ["name"],

Итак, конечный результат должен выглядеть так:

$X = array(
[0]=>
array(
["rel"]=> 4
["name"]=> "Bar"...
)
[1]=>
array(
["rel"]=> 1
["name"]=> "Foo"...
)
[2]=>
array(
["rel"]=> 4
["name"]=> "Tee"...
)
)

Я ищу эффективное решение этой проблемы.

В идеале array_unique функция, которая принимает key значение в качестве параметра для поиска повторений в данном массиве.

$ X = array_key_unique ($ A, ‘name’);

3

Решение

Эта функция должна делать работу:

function array_key_unique($arr, $key) {
$uniquekeys = array();
$output     = array();
foreach ($arr as $item) {
if (!in_array($item[$key], $uniquekeys)) {
$uniquekeys[] = $item[$key];
$output[]     = $item;
}
}
return $output;
}

И применяется к конкретной проблеме, упомянутой выше:

$X = array_key_unique($A, 'name');
5

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

Попробуй это..

 for ($i = 0; $i < count($A); $i++)
{
$repeated= null;
for ($j = $i+1; $j < count($A); $j++)
{
if (strcmp($A[$j]['name'],$A[$i]['name']) === 0)
{
$repeated= $j;
break;
}
}
if (!is_null($repeated))
array_splice($A,$repeated,1);
}
print_r($A);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector