У меня есть список. Должны выводится все, НО до тех пор, пока не найдутся с одинаковым именем, как например 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"
$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)
В предыдущем ответе изменяется структура результирующего массива, поэтому оставлю свой вариант:
<?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
)
)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый вечерЗапускаю веб сокет сервер на компьютере и пытаюсь подключиться к нему через клиент
Всем привет! Мне нужно корректировать фронтенд на готовом проекте, написанном на ларавеле 54, есть ли у меня шансы работать с проектом, если...
У меня в БД есть записи и в одной колонке есть массивы, вида ["1", "2", "3"] Хочу вывести например все записи, где в массиве присутствует цифра 2