PHP foreach循环嵌套

时间:2011-10-08 12:40:56

标签: php loops foreach nested

我有一系列相册$albums[]和一系列照片$photos。我想用所有匹配的照片回复每张专辑,并使用此代码:

<?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>

    <?
    }   
}

这很好用,但感觉效率很低。有没有更好的编码方式?

2 个答案:

答案 0 :(得分: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的数组。

答案 1 :(得分:0)

嗯,这是阵列结构的问题。我认为你不能以更好的方式实现这一目标。在 $ albums 数组中的每个相册元素中包含照片元素会很不错,但您必须预先解析它,这将是无用的。