Многомерный массив php удаляет дубликаты
Не уверен, что этот вопрос является дубликатом, нуждающимся в удалении, но я не мог найти ответ в другом месте, поэтому я попробую.
У меня есть 2d-массив, который выглядит следующим образом:
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]
)
)
Я хотел бы удалить те, у которых есть дубликаты писем. Поэтому в приведенном выше примере я хотел бы просто удалить либо [] [0], либо [] [2]. Я не беспокоюсь о проверке на имена или что-то в этом роде, мне просто нужно, чтобы вспомогательные массивы были дедуплицированы на основе одного значения.
На данный момент у меня есть что-то вроде этого
if(is_array($array) && count($array)>0){
foreach ($array as $subarray) {
$duplicateEmail[$subarray[2]] = isset($duplicateEmail[$subarray[2]]);
unset($duplicateEmail[$subarray[2]]);
}
}
но это просто неправильно. Любая помощь была оценена.
Ответы
Ответ 1
Быстрое решение, использующее уникальность индексов массива:
$newArr = array();
foreach ($array as $val) {
$newArr[$val[2]] = $val;
}
$array = array_values($newArr);
Примечание 1: Как видно сверху, последнее совпадение для адреса электронной почты используется вместо первого. Это можно изменить, заменив вторую строку на
foreach (array_reverse($array) as $val) {
Примечание 2: Индексы в результирующем массиве несколько смешаны. Но я думаю, это не имеет значения...
Ответ 2
Многое упрощенное решение.
$unique = array_map('unserialize', array_unique(array_map('serialize', $array)));
echo "<pre>";
print_r($unique);
Ответ 3
Комментарии пользователей для 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.
Ответ 4
$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);
Ответ 5
Мое предложение:
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;
}
Ответ 6
Пользователь SORT_REGULAR как второй параметр.
$uniqueArray = array_unique($array, SORT_REGULAR);