Как эффективно сравнить два массива, содержащих информацию о пользователях (id, email, name) — один из базы данных, другой получен частями — с целью получения двух новых массивов: пользователей, которых нет в базе данных, и записей из базы данных, которых нет среди пользователей? Учитывая что второй массив приходит частями, как решить данную задачу наиболее оптимальным образом?
Для сравнения двух массивов данных можно использовать циклы и условные операторы. Например, можно пройти по каждому элементу из массива, содержащего часть данных, и для каждого элемента проверить наличие его в базе данных. Однако, чтобы сделать этот процесс более эффективным, можно воспользоваться функционалом баз данных. Например, если у вас есть возможность выгрузить данные из массива во временную таблицу базы данных, вы можете выполнить SQL-запрос с использованием операторов JOIN (например, LEFT JOIN или RIGHT JOIN) для сравнения двух таблиц и получения нужных результатов. Другой способ - использовать функции поиска и фильтрации данных в программах обработки данных, таких как Python с библиотекой Pandas. Вы можете объединить два массива в DataFrame, применить методы поиска по индексам или значениям и получить результаты. В любом случае, оптимальный способ зависит от объема данных, доступных ресурсов и уровня сложности задачи.
Самое простое, "решение в лоб" <br/> <br/> <pre><code class="php">function getExcluded(array $users, array $emails): array
{
foreach ($emails as $email => $emailVal) {
foreach ($users as $key => $user) {
if ($user['email'] === $email) {
unset($emails[$email]);
unset($users[$key]);
break;
}
}
}
return [
'emails' => $emails,
'users' => $users,
];
}</code></pre> <br/> <br/> Единственное, могут быть коллизии если в массиве users будут несколько массивов с одинаковым email <br/> Если записей будет более чем 10к, то можно генераторы заюзать <a href="https://www.php.net/manual/ru/language.generators.overview.php" rel="nofollow">https://www.php.net/manual/ru/language.generators....</a> <br/> <br/> еще можно как-то так, компактнее: <br/> <pre><code class="php">function getExcluded(array $users, array $emails): array
{
$emailsFromUsers = [];
foreach ($users as $key => $user) {
if (!isset($emailsFromUsers[$user['email']])) {
$emailsFromUsers[$user['email']] = $user;
}
}
return [
'emails' => array_diff_key($emails, $emailsFromUsers),
'users' => array_diff_key($emailsFromUsers, $emails),
];
}</code></pre> <br/> <br/> Но опять же, не подходит если может быть несколько элементов в users с одинаковым email, но с разными айди, и, если я правильно все понимаю, это должно быть менее эффективно