Not sure if this question is a duplicate in need of removal, but I couldn't find the answer elsewhere so I'll have a go at asking.
I've got a 2d array that looks as follows:
Array
(
[0] => Array
(
[0] => dave
[1] => jones
[2] => c@b.c
)
[1] => Array
(
[0] => john
[1] => jones
[2] => a@b.c
)
[2] => Array
(
[0] => bruce
[1] => finkle
[2] => c@b.c
)
)
I'd like to remove those with duplicate emails. So in the above example I'd like to just remove either [][0] or [][2]. I'm not worried about checking against names or anything like that, I just need the sub arrays to be deduplicated based on a single value.
At the moment I have something like this
if(is_array($array) && count($array)>0){
foreach ($array as $subarray) {
$duplicateEmail[$subarray[2]] = isset($duplicateEmail[$subarray[2]]);
unset($duplicateEmail[$subarray[2]]);
}
}
but it just ain't right. Any help appreciated.
User SORT_REGULAR as second parameter.
The user comments for array_unique() have a few solutions to this. For example
from http://uk.php.net/manual/en/function.array-unique.php#57202.
A quick solution which uses the uniqueness of array indexes:
Notice 1: As visible from above, the last match for an email address is used instead of the first. This can be changed by replacing the second line with
Notice 2: The indexes in the resulting array are somewhat mixed up. But I guess this doesn't matter...
Much Simpler Solution.
You can use
array_column()
's clever key-assignment feature by usingnull
as the second parameter. This assigns new keys to each subarray while leaving the subarray data fully intact. These temporary keys ( element[2]
aka "email values") will effectively cause new subarrays with duplicate emails to overwrite previous ones. Once the duplicates are purged, just re-index the array (if necessary) witharray_values()
.Code: (Demo)
Output: