好的。所以我一直在努力弄清楚为什么我的脚本需要永远运行。我已经确定了一个潜在的原因,并想找出一种更有效的方法来执行以下功能:
function getwrs($obj, $recs) {
foreach ($obj as $key => $val) {
for ($i=0; $i<count($recs); $i++) {
$wr = array();
if ($recs[$i][0] === $key) {
$wr = $recs[$i];
break;
}
}
if (count($wr) > 0) {
for ($i=0; $i<count($val); $i++) {
if ($val[$i]["time"] < $wr[1] && abs($wr[1] - $val[$i]["time"]) < 30) {
$uwrs[] = array($val[$i], $wr);
}
}
}
}
return $uwrs;
}
我这样调用这个函数:
$wrs = getwrs($top15["pro"], $recs);
其中$top15["pro"]
是具有以下结构的多维数组:
[MAP1NAME] => Array
(
[0] => Array
(
[authid] => XXXX
[name] => XXXX
[time] => XXXX
[date] => XXXX
...
)
)
[MAP2NAME] => Array
(
[0] => Array
(
[authid] => XXXX
[name] => XXXX
[time] => XXXX
[date] => XXXX
...
)
[1] => Array
(
[authid] => XXXX
[name] => XXXX
[time] => XXXX
[date] => XXXX
...
)
...
)
并且包含超过 1500 个条目,$recs 是一个包含可比较值和大约 3000 个条目的数组,结构如下:
[0] => Array
(
[0] => MAP1NAME
[1] => TIMEVAL
[2] => USERNAME1
[3] => COUNTRY
)
...
此函数的目的是通过比较我数据库中每张地图的$top15
时间值 ( ) 与官方世界记录数组 ( $recs
) 中的时间值来查找非官方世界纪录。
现在我从我的数据库中获取每个地图名称,并从官方世界记录数组中找到相同的字符串,然后$wr
如果有官方记录,则将地图的官方世界记录值存储在一个变量中。接下来,我遍历数据库中的已完成时间数组,以查找哪些时间(如果有)小于官方记录时间。每次这是真的,我将与我的数据库时间和官方记录时间(用户、时间等)有关的信息都推送到一个新数组中。对我数据库中的每个键(地图名称)重复此操作。最后,该函数返回我的非官方世界记录数组 ( $uwrs
)。
问题很简单:由于某种原因,这需要太长时间。我最初用 JavaScript 编写了我的脚本,它的响应速度非常快,所以我可能认为我在这里做错了什么。有什么帮助吗?
编辑:我使用 xdebug 来查明问题,当我添加对该函数的调用时,我的输出文件从 3MB 变为超过 30MB,脚本运行时间从大约 1 秒变为 15-20 秒。我对这个工具比较陌生,所以我不知道这个信息是否重要。
编辑2:根据要求,我的数据库结构如下:
map | authid | name | time | date | weapon
前任:
kzbr_brickngrasshop | STEAM_0:1:XXXXXXX | John Travolta kz-endo | 23.582824 | 2013-08-25 | 03:40:17 | knife