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

Тема в разделе "PHP", создана пользователем rasandrey, 23 окт 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. rasandrey

    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 элементов, он бы вывел его пять раз, а нужен всего один.

    Подскажите, плиз, что не правильно делаю?
     
  2. Sanuch

    Sanuch

    Регистр.:
    25 май 2009
    Сообщения:
    207
    Симпатии:
    70
    для начала вынесите функцию перемешивания массива за пределы цикла. из привиденного кода не совсем понятно, где выводятся сами элементы.
     
  3. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    выводит этой функцией, сам масив $list

    modNewsFlashHelper::renderItem
     
  4. everest

    everest

    Регистр.:
    20 дек 2006
    Сообщения:
    197
    Симпатии:
    20
    если предположить, что

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

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

    то тогда нужно в
    выводить i-тый элемент без foreach
     
  5. swer

    swer

    Регистр.:
    15 июн 2008
    Сообщения:
    305
    Симпатии:
    38
    Вы повторяете цикл столько раз сколько записей в $list а вам нужно 1 раз, значит скорее всего правильно так
    PHP:
    for ($i 0;$i 1$i ++)
     
  6. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    разобрался, всем спасибо

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

    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; ?>
     
  7. zzxc

    zzxc Создатель

    Регистр.:
    27 дек 2007
    Сообщения:
    10
    Симпатии:
    3
    Здесь у вас переменные $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
    }
    ?>

    Так будет правильно показывать разделитель между записями.
     
  8. pierrevk

    pierrevk Постоялец

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

    PHP:
    $rand_key_massiva array_rand ($massiv);
    $rand_element=$massiv[$rand_key_massiva];
     
  9. Kloster

    Kloster

    Регистр.:
    22 июн 2009
    Сообщения:
    216
    Симпатии:
    12
    А ты уверен, что при таком выводе всех элементов они не повторятся?
     
  10. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    Лучше брать не каждый раз новый array_rand

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

    Тогда не будет повторений точно.
     
Статус темы:
Закрыта.