Выбор уникальных из массива по ключу (наверное так назову)

207
31 октября 2017, 00:28

У меня есть список. Должны выводится все, НО до тех пор, пока не найдутся с одинаковым именем, как например Anna. И вот тогда должна остаться та Anna, у которой в адресе *mail.ru. Но это только в том, случае если с одинаковым именем больше одного. Например Ivan должен остаться так как он один. Как более лаконично реализовать? Список большой на самом деле более 500 чел.

$entries[0]["displayname"]="Ivan"
$entries[0]["mail"]="123@mail"
$entries[1]["displayname"]="Anna"
$entries[1]["mail"]="aaa@yandex.ru"
$entries[2]["displayname"]="Bob"
$entries[2]["mail"]="bbb@yandex.ru"
$entries[3]["displayname"]="Anna"
$entries[3]["mail"]="123@mail.ru"
Answer 1
$entries[0]["displayname"]="Ivan";
$entries[0]["mail"]="123@mail";
$entries[1]["displayname"]="Anna";
$entries[1]["mail"]="aaa@yandex.ru";
$entries[2]["displayname"]="Bob";
$entries[2]["mail"]="bbb@yandex.ru";
$entries[3]["displayname"]="Anna";
$entries[3]["mail"]="123@mail.ru";
// --------------------------------- //
$newArr = [];
for ($i = count($entries); $i > 0; --$i) {
    $user = $entries[$i - 1];
    $name = $user['displayname'];
    $mail = $user['mail'];
    if (isset($newArr[$name])) {
        if (strpos('@mail.ru', $mail) !== false) {
            $newArr[$name]['mail'] = $mail;
        }        
    } else {
        $newArr[$name] = ['mail' => $mail];
    }     
    unset($entries[$i - 1]);       
}
print_r($newArr);
// output:
Array
(
    [Anna] => Array
        (
            [mail] => 123@mail.ru
        )    
    [Bob] => Array
        (
            [mail] => bbb@yandex.ru
        )    
    [Ivan] => Array
        (
            [mail] => 123@mail
        )    
)

Однако не учтен факт, что могут быть несколько человек с одним именем и почтой mail.ru (Например обе Anna имеют почты на mail.ru)

Answer 2

В предыдущем ответе изменяется структура результирующего массива, поэтому оставлю свой вариант:

<?php
$entries[0]["displayname"]="Ivan";
$entries[0]["mail"]="123@mail";
$entries[1]["displayname"]="Anna";
$entries[1]["mail"]="aaa@yandex.ru";
$entries[2]["displayname"]="Bob";
$entries[2]["mail"]="bbb@yandex.ru";
$entries[3]["displayname"]="Anna";
$entries[3]["mail"]="123@mail.ru";
$temp = [];
foreach ($entries as $item) {
    $temp[] = $item['displayname'];
}
$val = array_count_values($temp);
for ($i = 0, $j = count($entries, COUNT_RECURSIVE); $i < $j; $i++) {
    $int = isset($entries[$i]) ? $val[$entries[$i]['displayname']] : 0;
    if ($int > 1 && strpos($entries[$i]['mail'], 'mail.ru') === false) {
        unset($entries[$i]);
    }
}
echo '<pre>'; print_r($entries); echo '</pre>';

Результат:

Array
(
    [0] => Array
        (
            [displayname] => Ivan
            [mail] => 123@mail
        )
    [2] => Array
        (
            [displayname] => Bob
            [mail] => bbb@yandex.ru
        )
    [3] => Array
        (
            [displayname] => Anna
            [mail] => 123@mail.ru
        )
)
READ ALSO
Не подключается к сокет серверу

Не подключается к сокет серверу

Добрый вечерЗапускаю веб сокет сервер на компьютере и пытаюсь подключиться к нему через клиент

225
Почему может не работать Pjax?

Почему может не работать Pjax?

Пишу сайт на Yii2Захотел использовать Pjax

203
Laravel и Frontend? [требует правки]

Laravel и Frontend? [требует правки]

Всем привет! Мне нужно корректировать фронтенд на готовом проекте, написанном на ларавеле 54, есть ли у меня шансы работать с проектом, если...

220
Laravel 5 поиск по массиву в запросе

Laravel 5 поиск по массиву в запросе

У меня в БД есть записи и в одной колонке есть массивы, вида ["1", "2", "3"] Хочу вывести например все записи, где в массиве присутствует цифра 2

381