我正在建立一个简单的专辑并跟踪webapp但我正在进入一个泡菜,检索正确的信息并使其高效。我有两张桌子 - 专辑有大约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";
}
}
但后来我意识到,每次它通过父循环运行时,它会重新运行foreach而不是5000项,然后执行in_array 500次。这显然需要很长时间并且通常会使浏览器崩溃。引导我进入原始的嵌套while循环,效率稍高且复杂。
我已经开始认为array_intersect可能是解决方案,但我不想咆哮错误的树。
可能有太多的循环,你有什么进展但我需要自然排序和alpha /数字标题反流。
Screenie:http://ink361.com/#/photos/133115598501394804_9688917
答案 0 :(得分:1)
我认为,你应该重新考虑“追踪”查询。您可以加入“相册”表,将每个相册行添加到每个轨道行,并在结果数组上只进行一次循环,以生成所需的结果。
任何方式,您都可以在foreach ($listarray as $v){
之前完成所有$listarray[] = $list;
项内容。
而且,为什么在使用SQL时使用PHP进行排序。你真的需要吗?另外,你真的需要同时访问的所有5000件物品吗?不是每个男孩都希望完成排序,我的猫想按照歌曲的长度或类型排序,你有没有做过足够的思考?
为了更有效地处理效率,如果样本数据是可用的,那么与独立工作的“案例代码”一起是好的。你的代码在这一刻似乎已经破碎了。也许,你应该研究你的PHP编码实践。
答案 1 :(得分:1)
与许多其他问题一样,没有直接的方法可以提供帮助 HTML页面由5500行组成,总是低效且缓慢。令人难以置信的低效率和极其缓慢。
所以,你不需要一些狡猾的算法,但需要完全不同的架构。
分页是你需要的东西。
将您的列表拆分为页面。
答案 2 :(得分:-1)
您可以先flip the array检查密钥是否存在。与以前的迭代搜索不同,它的索引搜索速度要快得多。
$flipped_$albumRow = array_flip($albumRow);
foreach($trackArray as $k => $v){
if(isset($flipped_albumRow[$v['album']]))){ # <- line of interest.
$list.="track html info";
}
}