Удалить дубликаты в массиве, не используя array_unique

Мне нужно удалить дубликаты в моем массиве, но они не являются ТОЧНО дубликатами (поэтому я не могу использовать array_unique). На самом деле мне нужно игнорировать одно поле в «дубликат проверки». В приведенном ниже примере я хочу, чтобы ‘RecipientEmail’ игнорировался в чеке, поэтому третий элемент должен быть удален:

Array
(
[0] => Array
(
[RecipientID] => 1
[RecipientScreenname] => Lau T
[RecipientFirstname] => TK
[RecipientEmail] => lau@xx.co.uk
)

[1] => Array
(
[RecipientID] => 3
[RecipientScreenname] => Tom L
[RecipientFirstname] => Thomas
[RecipientEmail] => info@xx.com
)

[2] => Array
(
[RecipientID] => 1
[RecipientScreenname] => Lau T
[RecipientFirstname] => TK
[RecipientEmail] => other@xx.co.uk
)

)

Есть ли способ сделать это, используя любую функцию PHP?

1

Решение

Просто переиндексация на RecipientID и у тебя будет только один. Если вам нужно первое, используйте это, и если вам нужно последнее, то используйте array_reverse($array):

$result = array_column($array, null, 'RecipientID');

Если RecipientID не работает для уникальности, тогда вы можете построить ключ со значениями. Опять же, используйте это или array_reverse($array):

foreach($array as $v) {
$result[$v['RecipientID'].'-'
.$v['RecipientScreenname'].'-'
.$v['RecipientFirstname']
] = $v;
}

затем $result = array_values($result) если нужно.

1

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

Однолинейное решение без петель:

array_filter($list, function($el) use(&$unique) { return isset($unique[$key = "{$el['RecipientID']}-{$el['RecipientScreenname']}-{$el['RecipientFirstname']}"]) ? 0 : ($unique[$key] = 1); });

То же, но отформатировано:

array_filter(
$list,
function ($el) use (&$unique) {
return isset($unique[$key = "{$el['RecipientID']}-{$el['RecipientScreenname']}-{$el['RecipientFirstname']}"]) ? 0 : ($unique[$key] = 1);
}
);
2

Я написал функцию для вас. Посмотрите, работает ли это:

function make_unique($input, $ignore_column)
{
$input = array_reverse($input);
$orig = $input;
array_walk($input, function (&$v) use ($ignore_column) {
unset($v[$ignore_column]);
});

foreach($orig as $index =>$val)
{
unset($input[$index]);
unset($val[$ignore_column]);
if(in_array($val, $input))
unset($orig[$index]);
}

return(array_reverse($orig));
}
var_dump($input);
var_dump(make_unique($input, 'RecipientEmail'));

попробуйте это с помощью ввода, такого как это:

$input =[
[
'RecipientID' => '1',
'RecipientScreenname' => 'Lau T',
'RecipientFirstname' => 'TK',
'RecipientEmail' => 'lau@xx.co.uk'
],
[
'RecipientID' => '2',
'RecipientScreenname' => 'Tom hanks L',
'RecipientFirstname' => 'Thomas',
'RecipientEmail' => 'info@xx.com',
],
[
'RecipientID' => '3',
'RecipientScreenname' => 'Tom L',
'RecipientFirstname' => 'Thomas',
'RecipientEmail' => 'info@xx.com',
],
[
'RecipientID' => '4',
'RecipientScreenname' => '444',
'RecipientFirstname' => 'Thomas',
'RecipientEmail' => 'info@xx.com',
],
[
'RecipientID' => '2',
'RecipientScreenname' => 'Tom hanks L',
'RecipientFirstname' => 'Thomas',
'RecipientEmail' => 'infsdfsdfo@xx.com',
],
[
'RecipientID' => '1',
'RecipientScreenname' => 'Lau T',
'RecipientFirstname' => 'TK',
'RecipientEmail' => 'other@xx.co.uk',
]
];
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector