[英]Remove duplicates in array, without using 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函數嗎?
沒有循環的一線解決方案:
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);
}
);
只需在RecipientID
重新索引,您將只有一個。 如果需要第一個使用此方法,如果需要最后一個,請使用array_reverse($array)
:
$result = array_column($array, null, 'RecipientID');
如果RecipientID
不適用於唯一性,則可以使用值構建密鑰。 再次使用this或array_reverse($array)
:
foreach($array as $v) {
$result[$v['RecipientID'].'-'
.$v['RecipientScreenname'].'-'
.$v['RecipientFirstname']
] = $v;
}
然后,如果需要, $result = array_values($result)
。
我為您編寫了一個函數。 查看是否可行:
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',
]
];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.