2011-10-08 338 views
0

我有一個相冊陣列$albums[]和一組照片$photos。我想用每個相冊的照片回顯每張相冊,並使用以下代碼:PHP foreach循環嵌套

<?php 
    ... 

    foreach($albums as $album){ 
     if($album[photo_count] !== 0){ 
      if($album[photo_count] > 10){ 
       $limit = 10; 
      } 

      $boxID = $id = substr($album[aid], strrpos($album[aid], '_')+1);  
?> 
      <div id="gal-<?=$boxID?>-box" class="box gallery-album"> 
      <? 
      $i = 0; 

      foreach($photos as $photo){        
       if(($photo[aid] == $album[aid]) && ($i < $limit)){ 
        echo '<img src="'.$photo[src_big].'" alt="'.$photo[caption].'"/>'; 
        $i++; 
       } 
     } 

    ?> 
    </div> 
    </div> 

    <? 
    } 
} 

這很好,但感覺效率很低。有沒有更好的編碼方式?

+0

你可以在第一個循環之外設置'$ limit',它總是不變的。如果你想改善代碼味道,JRL的答案如下。 –

回答

2

我不會擔心它是否看起來高效,而是它是乾淨的還是可維護的。因此,我建議你將代碼分成兩個功能,一個可以找到與專輯相關的所有照片,另一個可以創建用於顯示它的html,例如,是這樣的:

/** 
* Gets the photos for a given album 
* @param int $albumId the album identifier 
* @return array an array of photos associated with this album, 
*    or an empty array if there are none 
*/ 
function getPhotos($albumId); 

/** 
* Outputs an html div for each photo in the photo array 
* @param array $photos an array of photos 
*/ 
function displayPhotos($photos); 

您也可以使用一些SPL迭代器,使代碼更清潔,如LimitIterator,你會用限制傳遞給displayPhotos特定專輯陣列。

0

嗯,這是數組結構的問題。我認爲你不能以更好的方式實現這一目標。這將是很高興有照片元素內每個專輯元素在您的$相冊數組,但你必須預先解析它,這將是無用的。