up vote 1 down vote favorite
1

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] => [email protected]
    )

[1] => Array
    (
        [0] => john
        [1] => jones
        [2] => [email protected]

    )

[2] => Array
    (
        [0] => bruce
        [1] => finkle
        [2] => [email protected]
    )
)

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.

flag

3 Answers

up vote 1 down vote accepted

A quick solution which uses the uniqueness of array indexes:

$newArr = array();
foreach ($array as $val) {
    $newArr[$val[2]] = $val;    
}
$array = array_values($newArr);

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

foreach (array_reverse($array) as $val) {

Notice 2: The indexes in the resulting array are somewhat mixed up. But I guess this doesn't matter...

link|flag
your 'for' should have been a 'foreach' but otherwise it works well, thanks. – Kin Dec 8 '09 at 10:06
you're totally right, I changed this. Thanks – Cassy Dec 8 '09 at 12:16
up vote 1 down vote

The user comments for array_unique() have a few solutions to this. For example

    function multi_unique($array) {
        foreach ($array as $k=>$na)
            $new[$k] = serialize($na);
        $uniq = array_unique($new);
        foreach($uniq as $k=>$ser)
            $new1[$k] = unserialize($ser);
        return ($new1);
    }

from http://uk.php.net/manual/en/function.array-unique.php#57202.

link|flag
1  
which covers the whole sub-array rather than individual values if i'm not mistaken – Kin Dec 7 '09 at 17:54
+1 for solution to complex task – YsoL8 Mar 12 at 21:43
up vote 0 down vote
$array = array(
    array('dave','jones','[email protected]'),
    array('dave','jones','[email protected]'),
    array('dave','jones','[email protected]'),
    array('dave','jones','[email protected]'),
    array('dave','jones','[email protected]')	
);

$copy = $array; // create copy to delete dups from
$usedEmails = array(); // used emails

for( $i=0; $i<count($array); $i++ ) {

    if ( in_array( $array[$i][2], $usedEmails ) ) {
    	unset($copy[$i]);
    }
    else {
    	$usedEmails[] = $array[$i][2];
    }

}

print_r($copy);
link|flag

Your Answer

get an OpenID
or
never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.