我正在构建一个简单的相册和跟踪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 ($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_incross可能是解决方案,但我不想找错树。
可能有太多的循环,你在做什么,但我需要自然排序和字母/数字标题反流。
屏幕:http://ink361.com/#/photos/133115598501394804_9688917
我认为,您应该重新思考"tracks"查询。您可以加入"相册"表,将每个相册行添加到每个音轨行,并在结果数组上只进行一个循环,以生成所需的结果。
无论如何,您可以在$listarray[] = $list;
之前完成所有foreach ($listarray as $v){
的工作。
而且,既然你已经用SQL进行了排序,为什么还要用PHP进行排序呢。你真的需要吗?此外,您真的需要同时访问这5000个项目吗?并不是每个男孩都想这样分类,我的猫想按照歌曲的长度或一般来分类,你想得够多了吗?
为了更有效地处理效率问题,如果样本数据与独立的工作"案例代码"一起是可浏览的,这是很好的。您的代码此时似乎已损坏。也许,您应该研究php编码实践。
与许多其他问题一样,没有直接的方法可以帮助解决问题
一个由5500行组成的HTML页面总是效率低下且速度缓慢。效率低得令人难以置信,速度慢得惊人。
所以,你不需要一些狡猾的算法,而是需要完全不同的架构。
分页是您需要的东西
将列表拆分为多页。
您可以先翻转数组,然后检查键是否存在。与以前的迭代搜索不同,这将以更快的速度进行索引搜索。
$flipped_$albumRow = array_flip($albumRow);
foreach($trackArray as $k => $v){
if(isset($flipped_albumRow[$v['album']]))){ # <- line of interest.
$list.="track html info";
}
}