数组比较,循环和效率

时间:2012-02-28 09:17:55

标签: php mysql arrays while-loop

我正在建立一个简单的专辑并跟踪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

3 个答案:

答案 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";
    }
}