Не уверен, что этот вопрос является дубликатом, нуждающимся в удалении, но я не мог найти ответ в другом месте, поэтому я попробую.
У меня есть 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);