Подтвердить что ты не робот

Многомерный массив 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]]);
   }
  }

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

4b9b3361

Ответ 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);