Справка по PHP для каждого цикла

#php #codeigniter #loops #foreach #modulus

#php #codeigniter #циклы #foreach #модуль

Вопрос:

Надеюсь, кто-нибудь сможет мне помочь,

У меня на моем веб-сайте есть массив изображений, он выглядит примерно так,

 $usp = array('/images/usp1.jpg',
             '/images/usp2.jpg', 
             '/images/usp3.jpg', 
             '/images/usp4.jpg', 
             '/images/usp5.jpg', 
             '/images/usp6.jpg'
            );
  

У меня есть страница, которая перебирает мои продукты и отображает изображение продукта и некоторые детали в li . Что я хочу сделать, так это начать цикл со случайного выбора из $usp массива, а затем показать 4 продукта, затем поместить другой случайный выбор из $usp массива, затем показать еще 4 продукта, а затем показать другой случайный выбор из $usp массива.

По сути, я хочу этот эффект

 USP PRODUCT PRODUCT  
PRODUCT PRODUCT USP  
PRODUCT PRODUCT PRODUCT  
PRODUCT USP PRODUCT  
PRODUCT PRODUCT PRODUCT  
USP PRODUCT PRODUCT
  

В настоящее время это цикл, который у меня есть.

    <?php if(count($product_sets) >= 1) : ?>
                <div class="clear clearfix productWrap" id="homeBestSellers">
                    <!-- <h3 class="label"><?php echo $category_details->categoryTitle; ?> <br> Product Sets</h3> -->

                    <ul class="clear clearfix productBoxes">
                    <?php
                    $number_of_blanks = (3 - (count($product_sets) % 3)); // 0, 1 or 2.
                    if ($number_of_blanks == 3) :
                        $number_of_blanks = 0;
                    endif;
                    $number_of_rows = ceil(count($product_sets) / 3);
                    $currentItem = 1;
                    foreach ($product_sets as $product)
                    {
                        $currentRow = ceil($currentItem / 3);
                        $currentColumn = $currentItem - (($currentRow - 1) * 3);
                        if ($number_of_blanks == 2) :
                            if (($number_of_rows > 1 amp;amp; $currentRow == ($number_of_rows - 1) amp;amp; $currentColumn == 2) || ($number_of_rows == 1 amp;amp; $currentColumn == 1)) :
                                ?>
                                <li><img src="<?php echo site_url('assets/img/blocks/guarantee.png'); ?>" alt="5 Year Guarantee" width="242" height="156"></li>
                                <?php
                                $currentItem  ;
                            endif;
                        endif;
                        ?>
                        <li class="<?php if($currentItem % 3 == 0) echo 'endHomeBlock';?>">
                            <?php $this->load->view('blocks/product_small', array('product' => $product)); ?>
                        </li>
                    <?php
                        $currentItem  ;

                    }
                    if ($number_of_blanks > 0) :
                        ?>
                        <li><img src="<?php echo site_url('assets/img/blocks/phone-number.png'); ?>" alt="Phone Number" width="242" height="156"></li>
                        <?php
                    endif;
                    ?>
                    </ul><!-- #productSets -->
                </div><!-- #productWrap -->
                <?php endif; ?>
  

Как я могу изменить это, чтобы добиться желаемого эффекта?

Ответ №1:

Вставить в начало цикла (приблизительная концепция, возможно, потребуется некоторая модификация для соответствия вашему коду):

 if ($currentItem % 4 == 0) {        // every fourth item
    $randIndex = array_rand($usp);  // pick random index from $usp
    $randUsp = $usp[$randIndex];
    // code to display $randUsp     // and display it in the table
}
  

Редактировать: Как указано @Ben, вы можете захотеть удалять элементы из $usp по мере их использования или отслеживать, какие из них уже были возвращены, чтобы один и тот же элемент не возвращался несколько раз, если это потенциальная проблема.

Комментарии:

1. Это потенциально может привести к возврату повторяющихся $usp элементов.

Ответ №2:

 shuffle($usp);
foreach ($product_sets as $i => $product) {
    if ($i % 4 == 0) {
        list(, $randUsp) = each($usp);
        echo $randUsp;
    }

    …
}
  

Предполагается, $product_sets что это массив с непрерывной числовой индексацией. В противном случае используйте отдельный $i = 0 , который вы увеличиваете на каждый ход.

Ответ №3:

Если вы не хотите, чтобы какие-либо элементы $ usp появлялись дважды, вам следует сделать это перед вашим циклом foreach:

 shuffle($usp);
  

И затем в верхней части вашего цикла foreach:

 if ($currentItem % 4 == 0) {
    $randusp = array_pop($usp);
    # output $randusp here...
}