数组比较,而循环和效率


Array compare, while loops and efficency

我正在构建一个简单的相册和跟踪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";
    }
}