php - 应用于大型数组时,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,然后将它们与存储所有游戏的数据库交叉引用。同样,这可能不是最好的方法,但目前我只能想到一个。
解决方案
如果您使用重新索引$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"];
}
}
推荐阅读
- javascript - jsp包含文件没有换行符
- c# - 如何使用 ClearScript 将 JavaScript 数组传递给主机?
- ag-grid - 如何在 ag-grid 的源数据中设置单元格背景颜色
- python - 如何提高向 ScyllaDB 添加数据的性能?
- c - Openssl密码套件解释
- tfs - 在测试摘要中无法读取 TFS 中未定义的属性“操作”
- terraform - 错误 terraform init, plan , apply
- jenkins - Jenkins - 如何确定兼容的升级版本插件版本?
- node.js - 如何使 vertx-node 套接字服务器接受来自 WebSocket 的请求
- perl - 如何将 .har 请求转换为 HTTP 字符串?