首页 > 解决方案 > 应用于大型数组时,PHP Foreach 循环太慢

问题描述

所以,基本上,我必须循环考虑一个包含 25000 个项目的数组,然后将每个项目与另一个数组的 ID 进行比较,如果 ID 来自第一个数组和第二个匹配项,则创建另一个匹配项的数组。看起来像这样。

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"];
     }
  }
}

我用第一个数组 ($all_games) 中的 2500 条记录和第二个数组 ($user_games_ids) 中的大约 2000 条记录测试了这个循环,据我所知,执行那段代码大约需要10 秒,只有循环执行。这正常吗?那应该花那么长时间还是我从错误的角度来处理这个问题?有没有办法减少这个时间?因为当我将该代码应用于 25000 条记录时,时间会显着增加。

任何帮助表示赞赏,谢谢。

编辑:所以没有混淆,我不能使用数据库查询来提高性能,虽然,我已经将所有 25000 个游戏添加到数据库中,但我不能对用户游戏 ID 做同样的事情。我无法知道通过我正在访问的那个 API 来获取所有用户,即使有,那也确实是很多用户。当用户在表单中输入其 ID 时,我会即时获取用户游戏 ID,并基于此我使用 file_get_contents 获取这些 ID,然后将它们与存储所有游戏的数据库交叉引用。同样,这可能不是最好的方法,但目前我只能想到一个。

标签: phparraysperformanceforeach

解决方案


如果您使用重新索引$game数组,则可以将其减少为一个循环并检查数据是否设置...appidarray_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"];
    }
}

推荐阅读