Цикл PHP Foreach слишком медленный при применении к большим массивам - PullRequest
0 голосов
/ 04 июня 2018

Итак, в основном, я должен зациклить массив из 25000 элементов, а затем сравнить каждый элемент с идентификатором другого массива, а если идентификаторы из первого массива и второго совпадения, то создать еще один массив совпадающих элементов.Это выглядит примерно так.

foreach ($all_games as $game) {
  foreach ($user_games_ids as $user_game_id) {
     if ($user_game_id == $game["appid"]) {
         $game_details['title'][] = $game["title"];
         $game_details['price'][] = $game["price"];
         $game_details['image'][] = $game["image_url"];
         $game_details['appid'][] = $game["appid"];
     }
  }
}

Я протестировал этот цикл только с 2500 записями из первого массива ($ all_games) и примерно с 2000 записями из второго массива ($ user_games_ids), и, насколько я понял,для выполнения этого фрагмента кода требуется около 10 секунд , только выполнение цикла.Это нормально?Должно ли это занять много времени или я подхожу к вопросу с другой стороны?Есть ли способ сократить это время?Потому что когда я применяю этот код к 25000 записей, это время значительно увеличивается.

Любая помощь приветствуется, спасибо.

РЕДАКТИРОВАТЬ: Так что нет путаницы, я могуне использую запрос к базе данных для повышения производительности, хотя я добавил все 25000 игр в базу данных, я не могу сделать то же самое для идентификаторов пользовательских игр.Я не знаю, каким образом можно получить доступ ко всем пользователям через этот API, к которому я получаю доступ, и даже если это так, это будет действительно много пользователей.Я получаю идентификаторы игр на лету, когда пользователь вводит свой идентификатор в форму, и на основании этого я использую file_get_contents для получения этих идентификаторов, а затем сопоставляю их с базой данных, в которой хранятся все игры.Опять же, это может быть не самый лучший способ, но только один, о котором я мог подумать на данный момент.

1 Ответ

0 голосов
/ 04 июня 2018

Если вы переиндексируете массив $game с помощью appid, используя array_column(), вы можете сократить его до одного цикла и просто проверить, установлены ли данные ...

$game = array_column($game,null,"appid");
foreach ($user_games_ids as $user_game_id) {
    if (isset( $game[$user_game_id])) {
        $game_details['title'][] = $game[$user_game_id]["title"];
        $game_details['price'][] = $game[$user_game_id]["price"];
        $game_details['image'][] = $game[$user_game_id]["image_url"];
        $game_details['appid'][] = $game[$user_game_id]["appid"];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...