Многомерный массив php удаляет дубликаты

Не уверен, что этот вопрос является дубликатом, нуждающимся в удалении, но я не мог найти ответ в другом месте, поэтому я попробую.

У меня есть 2d-массив, который выглядит следующим образом:

Array ( [0] => Array ( [0] => dave [1] => jones [2] => c@bc ) [1] => Array ( [0] => john [1] => jones [2] => a@bc ) [2] => Array ( [0] => bruce [1] => finkle [2] => c@bc ) ) 

Я хотел бы удалить те, у которых есть дубликаты писем. Поэтому в приведенном выше примере я хотел бы просто удалить либо [] [0], либо [] [2]. Я не беспокоюсь о том, чтобы проверять имена или что-то в этом роде, мне нужно, чтобы вспомогательные массивы были дедуплицированы на основе одного значения.

На данный момент у меня есть что-то вроде этого

  if(is_array($array) && count($array)>0){ foreach ($array as $subarray) { $duplicateEmail[$subarray[2]] = isset($duplicateEmail[$subarray[2]]); unset($duplicateEmail[$subarray[2]]); } } с  if(is_array($array) && count($array)>0){ foreach ($array as $subarray) { $duplicateEmail[$subarray[2]] = isset($duplicateEmail[$subarray[2]]); unset($duplicateEmail[$subarray[2]]); } } 

но это просто неправильно. Любая помощь оценивается.

Быстрое решение, использующее уникальность индексов массива:

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

Примечание 1: Как видно сверху, последнее совпадение для адреса электронной почты используется вместо первого. Это можно изменить, заменив вторую строку на

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

Примечание 2: Индексы в результирующем массиве несколько замешаны. Но я думаю, это не имеет значения …

Много упрощенное решение.

 $unique = array_map('unserialize', array_unique(array_map('serialize', $array))); echo "<pre>"; print_r($unique); 

Пользовательские комментарии для array_unique () имеют несколько решений. Например

  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); } 

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

 $array = array( array('dave','jones','c@b.c'), array('dave','jones','a@c.d'), array('dave','jones','c@b.c'), array('dave','jones','e@v.d'), array('dave','jones','a@c.d') ); $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); с $array = array( array('dave','jones','c@b.c'), array('dave','jones','a@c.d'), array('dave','jones','c@b.c'), array('dave','jones','e@v.d'), array('dave','jones','a@c.d') ); $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); 

Мое предложение:

 protected function arrayUnique($array, $preserveKeys = false) { $uniqueArray = array(); $hashes = array(); foreach ($array as $key => $value) { if (true === is_array($value)) { $uniqueArray[$key] = $this->arrayUnique($value, $preserveKeys); } else { $hash = md5($value); if (false === isset($hashes[$hash])) { if ($preserveKeys) { $uniqueArray[$key] = $value; } else { $uniqueArray[] = $value; } $hashes[$hash] = $hash; } } } return $uniqueArray; } 

Пользователь SORT_REGULAR будет вторым параметром.

 $uniqueArray = array_unique($array, SORT_REGULAR);