【发布时间】:2012-03-17 18:20:30
【问题描述】:
我正在构建一个简单的专辑和曲目 web 应用程序,但我在检索正确信息并使其高效时陷入困境。我有两张桌子 - 专辑大约有 500 个项目,曲目大约有 5000 个。
所以我从一个正常的 while 循环开始:
$albumQuery = "SELECT * FROM `album` ORDER BY album ASC";
$albumDatabase = mysql_query($albumQuery, $admin) or die(mysql_error());
while($albumRow = mysql_fetch_array($albumDatabase)){
$list = "";
$list.="build some html for showing later";
这是我遇到效率问题的地方:
$trackQuery = "SELECT track, album FROM `track` WHERE album = '{$album}' ORDER BY filename ASC";
$trackDatabase = mysql_query($trackQuery, $admin) or die(mysql_error());
while($trackRow = mysql_fetch_array($trackDatabase)){
$list.="track html info";
}
$listarray[] = $list;
}
natcasesort($listarray);
然后我稍后在正文中运行一个 foreach
foreach ($listarray as $v){
$first_letter = strtoupper(mb_substr($v,9,1));
if($tmp!==$first_letter){
$tmp = $first_letter;
echo '<div class="alphaHolder">'.$tmp.'</div>';
}
echo $v;
}
这很有效,除了可能非常低效。
我可以让它以正确的方式和顺序反刍所有信息。
作为一个实验,我将第二个 while 循环放在父循环之外,并将此信息放入它自己的数组中。然后运行这个:
foreach($trackArray as $k => $v){
if(in_array($v['album'], $albumRow)){
$list.="track html info";
}
}
但后来我意识到,每次它通过父循环运行时,它都会在 5000 个项目上重新运行 foreach,然后执行 in_array 500 次。这显然需要很长时间并且通常会使浏览器崩溃。将我引向原来的嵌套 while 循环,它的效率和复杂度更高。
我已经开始认为 array_intersect 可能是解决方案,但我不想找错树。
可能有太多循环,你在做什么,但我需要自然排序和字母/数字标题反刍。
【问题讨论】:
-
你忘了提什么。像整个混乱的目标这样的小事。你的目标是什么?要在单个页面上构建包含 5000 条曲目的列表?
-
是的,包含所有专辑的整页,然后是每个专辑下方的相应曲目。
-
好吧,我可以告诉你,一个包含 5000 行的 HTML 页面总是效率低下且速度慢。
-
请不要在您的帖子上签名。以前的签名被删除是有原因的。
标签: php mysql arrays while-loop