2012-02-28 74 views
2

林建立一個簡單的專輯和跟蹤網絡應用程序,但即時通訊檢索正確的信息,並使其高效進入泡菜。我有兩個表 - 這張專輯有大約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"; 

這是我進入一個efficency問題:

$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; 
} 

這工作完全後運行一個foreach,一部分可能可能是大規模不足的。

我可以讓它以正確的方式和順序反芻所有的信息。

作爲一個實驗,我將第二個while循環放在父循環之外,並將此信息粘貼到它自己的數組中。然後跑了這一點:

foreach($trackArray as $k => $v){ 
    if(in_array($v['album'], $albumRow)){ 
     $list.="track html info"; 
    } 
} 

但後來我意識到,每一次它貫穿於母公司循環的重新運行超過5000項,然後做in_array 500倍的foreach。這顯然需要很長時間,並且通常會使瀏覽器崩潰。帶領我到最初的嵌套while循環稍微更高效和複雜。

我已經開始認爲array_intersect可能是解決方案,但我不想ark出錯的樹。

可能有太多的循環,你在做什麼,但我需要自然排序和alpha /數值標題返流。

的screenie:http://ink361.com/#/photos/133115598501394804_9688917

+2

你忘了提及一些東西。作爲整個混亂的目標**這樣的小事情。你的目標是什麼?在單個頁面上構建5000首曲目列表? – 2012-02-28 09:50:12

+0

是一個完整的頁面,包含所有相冊,然後是每個相冊下面的相應曲目。 – MarkBeharrell 2012-02-28 10:19:49

+0

那麼,我可以告訴你,一個包含5000行的HTML頁面總是效率低下,速度慢。 – 2012-02-28 10:21:12

回答

-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"; 
    } 
} 
+0

Ahhh更有建設性的幫助,而不是判斷代碼。謝謝! – MarkBeharrell 2012-02-28 10:21:05

+0

你不會相信這整個過程會更快。我將把它與JOIN結合起來(這可能意味着這將變得多餘,但仍然是它的一切有用的學習!) – MarkBeharrell 2012-02-28 21:19:02

+0

@Mark地面信息基於這篇文章。 http://stackoverflow.com/questions/8826908/what-is-the-best-way-to-find-difference-between-2-large-array – 2012-02-28 21:22:27

1

我想,你應該重新考慮 「軌道」 查詢。您可以加入「專輯」表,將每個專輯行添加到每個曲目行,並僅對結果數組進行一次循環,以生成所需的結果。

無論如何,你可以在$listarray[] = $list;之前完成所有foreach ($listarray as $v){的東西。

而且,爲什麼在使用SQL的時候使用PHP進行排序呢?你真的需要嗎?另外,你是否真的需要同時訪問所有這5000個項目?不是每個男人都想要完成這個排序,我的貓會喜歡按照歌曲的長短排序,或者你是否已經做了足夠的思考?

爲了更高效地處理效率問題,如果樣本數據具有可用性,則可以使用獨立工作的「案例代碼」。你的代碼似乎在這一刻破碎了。也許,你應該研究你的php編碼習慣。

+0

好的。這是下一步 - 加入查詢。 我希望應用程序工作的方式確實需要sql沒有的自然排序方面。 是的,我意識到給出更多的代碼會有所幫助,但我沒有把它全部交給手 - 我已經給出的是這裏發生的事情和它從記憶中獲得的主旨。 在項目的後續階段,排序將以其他方式進行控制 - 這就是「我」希望它在當前工作的方式。 – MarkBeharrell 2012-02-28 10:11:14

+0

@Mark mysql排序有什麼問題?有一個例子嗎? – 2012-02-28 10:25:56

+0

效率是棘手的東西。當今的主要議題不是機器能力,而是客戶/用戶的需求。如果你沒有效率的代碼「做這份工作」,你可以找到服務器,它可以輕鬆處理它,不需要增加代碼,除非你缺乏資源。 – Deele 2012-02-28 10:30:34

1

與其他許多問題一樣,沒有直接的方法可以提供幫助。
一個HTML頁面由5500行組成,總是效率低下且速度慢。令人難以置信的低效率和顯着緩慢。

所以,你不需要一些狡猾的算法,但完全不同的體系結構。

分頁是你需要的東西。

將列表分割爲頁面。

+0

是的,這一直是一個解決方案,但不是我的主要目標。在一次打你一切都是我想要的... http://ink361.com/#/photos/133115598501394804_9688917 – MarkBeharrell 2012-02-28 10:40:13

+1

@Mark如果這是你想要的,使用AJAX。首先,顯示所有專輯,當用戶點擊任何請求到服務器時,爲該專輯帶來曲目和信息。 – Deele 2012-02-28 11:05:06

+0

啊,這可能是一個不錯的解決方案。由於最初的專輯視圖幾乎是幾秒鐘。 *打開AJAX tome * – MarkBeharrell 2012-02-28 11:27:50