PHP циклы foreach вложенные - PullRequest
       14

PHP циклы foreach вложенные

0 голосов
/ 08 октября 2011

У меня есть массив альбомов $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 ]

2 голосов
/ 08 октября 2011

Я бы не беспокоился о том, кажется ли это эффективным , а о том, является ли он чистым и обслуживаемым.

Поэтому я бы предложил разделить код на две функции.один, который находит все фотографии, связанные с альбомом, и один, который создает 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 голосов
/ 08 октября 2011

Ну, это проблема того, как структурированы ваши массивы.Я не думаю, что вы могли бы достичь этого лучше.Было бы неплохо иметь элемент photos внутри каждого элемента album в массиве $ album * , но вам придется предварительно проанализировать его, чтобыло бы бесполезно.

...