@kategg

Как сравнить 2 массива?

Есть 1 массив вида email => id. Содержит 10к+ элементов
$emails = [
        'test1@email.ru' => 123,
        'test2@email.ru' => 244,
        'test3@email.ru' => 342, 
        // ...
    ];

Есть еще один массив, другого вида. Содержит также 10к+ элементов, но приходит частями по 100 элементов, т.е. чтобы получить целый массив придется складывать каждый пришедший.
$users = [
        [
            'id' => 34235,
            'email' => 'test1@mail.ru',
            'name' => 'Name 1'
        ],
        [
            'id' => 37855,
            'email' => 'test2@mail.ru',
            'name' => 'Name 2'
        ]
        // ...
    ];

Надо сравнить эти массивы по email-адресу и получить 2 результирующих массива:
1. Массив пользователей из массива $users, которых нет в массиве $emails
2. Массив записей, из массива $emails, которых нет в массиве $users

Как лучше решить данную задачу?
  • Вопрос задан
  • 220 просмотров
Пригласить эксперта
Ответы на вопрос 1
pickHabr
@pickHabr
Костыльных дел мастер
UPD в соответствии с комментариями

Самое простое, "решение в лоб"

function getExcluded(array $users, array $emails): array
{
    foreach ($users as $key => $user) {
        if (isset($emails[$user['email']])) {
            unset($emails[$user['email']]);
            unset($users[$key]);
            break;
        }
    }

    return [
        'emails' => $emails,
        'users' => $users,
    ];
}


Единственное, могут быть коллизии если в массиве users будут несколько массивов с одинаковым email
При необходимости можно генераторы заюзать https://www.php.net/manual/ru/language.generators....
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы