Требуется помощь в небольшом куске кода php

Статус
В этой теме нельзя размещать новые ответы.

rasandrey

Участник
Регистрация
2 Апр 2009
Сообщения
214
Реакции
6
Есть такой кусок кода:

<?php for ($i = 0, $n = count($list); $i < $n; $i ++) :
shuffle($list);
foreach ($list as $item) :
modNewsFlashHelper::renderItem($item, $params, $access);
endforeach;
if ($n > 1 && (($i < $n – 1) || $params->get('showLastSeparator'))) : ?>
<span class="article_separator"> </span>
<?php endif; ?>
<?php endfor; ?>

В массиве у меня сейчас 4 элемента. Этот код должен получать количество элементов массива, мешать их случайным образом между собой и вывести один раз каждый элемент массива. Но сейчас он выводит 4 раза. Если бы у меня было в массиве 5 элементов, он бы вывел его пять раз, а нужен всего один.

Подскажите, плиз, что не правильно делаю?
 
для начала вынесите функцию перемешивания массива за пределы цикла. из привиденного кода не совсем понятно, где выводятся сами элементы.
 
для начала вынесите функцию перемешивания массива за пределы цикла. из привиденного кода не совсем понятно, где выводятся сами элементы.

выводит этой функцией, сам масив $list

modNewsFlashHelper::renderItem
 
если предположить, что

foreach ($list as $item) :
modNewsFlashHelper::renderItem($item, $params, $access);
endforeach;

выводит элементы массива, то зачем вывод в цикле?
каждый цикл будет выводить все элементы...

а если вы используете цикл для вывода

if ($n > 1 && (($i < $n – 1) || $params->get('showLastSeparator'))) : ?>
<span class="article_separator"> </span>
<?php endif; ?>

то тогда нужно в
modNewsFlashHelper::renderItem($item, $params, $access);
выводить i-тый элемент без foreach
 
for ($i = 0, $n = count($list); $i < $n; $i ++)
Вы повторяете цикл столько раз сколько записей в $list а вам нужно 1 раз, значит скорее всего правильно так
PHP:
for ($i = 0;$i < 1; $i ++)
 
разобрался, всем спасибо

нужно было так

shuffle($list);
foreach ($list as $item) :
modNewsFlashHelper::renderItem($item, $params, $access);
endforeach;
if ($n > 1 && (($i < $n - 1) || $params->get('showLastSeparator'))) : ?>
<span class="article_separator">&nbsp;</span>
<?php endif; ?>
 
Здесь у вас переменные $i и $n не получат ниоткуда свое значение.

Надо так:

<?php
shuffle($list);
for ($i = 0, $n = count($list); $i < $n; $i ++) {
modNewsFlashHelper::renderItem($item, $params, $access);
if ($n > 1 && (($i < $n – 1) || $params->get('showLastSeparator'))) : ?>
<span class="article_separator"> </span>
<?php
}
?>

Так будет правильно показывать разделитель между записями.
 
Есть такой кусок кода:
<?php for ($i = 0, $n = count($list); $i < $n; $i ++) :
shuffle($list);
foreach ($list as $item) :
modNewsFlashHelper::renderItem($item, $params, $access);
endforeach;
if ($n > 1 && (($i < $n – 1) || $params->get('showLastSeparator'))) : ?>
<span class="article_separator"> </span>
<?php endif; ?>
<?php endfor; ?>
В массиве у меня сейчас 4 элемента. Этот код должен получать количество элементов массива, мешать их случайным образом между собой и вывести один раз каждый элемент массива. Но сейчас он выводит 4 раза. Если бы у меня было в массиве 5 элементов, он бы вывел его пять раз, а нужен всего один.
Подскажите, плиз, что не правильно делаю?

Как сложно то... мешать еще, потом выбирать!
А мешать то вообще нужно?
если цель-таки получить элемент массива рандомно (как я понял, вы перемешанный массив далее не используете?) - просто взять элемент из массива случайно - как пример -

PHP:
$rand_key_massiva = array_rand ($massiv);
$rand_element=$massiv[$rand_key_massiva];
 
Как сложно то... мешать еще, потом выбирать!
А мешать то вообще нужно?
если цель-таки получить элемент массива рандомно (как я понял, вы перемешанный массив далее не используете?) - просто взять элемент из массива случайно - как пример -
PHP:
$rand_key_massiva = array_rand ($massiv);
$rand_element=$massiv[$rand_key_massiva];
А ты уверен, что при таком выводе всех элементов они не повторятся?
 
Лучше брать не каждый раз новый array_rand

А лучше сразу взять требуемое рандомное кол-во элементов из массива через array_rand($massiv, $count);

Тогда не будет повторений точно.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху