#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...
}