За последние 24 часа нас посетили 19134 программиста и 1642 робота. Сейчас ищут 853 программиста ...

оператор, выводящий переменные массива в случайном порядке

Тема в разделе "PHP для новичков", создана пользователем Contessa, 1 окт 2012.

  1. Contessa

    Contessa Активный пользователь

    С нами с:
    8 мар 2012
    Сообщения:
    74
    Симпатии:
    0
    Поскажите, пожалуйста, оператор, который может перебирать все переменные в массиве и выводить их на экран по одной в случайном порядке, ни разу не повторяя, пока не переберет весь массив. И пример записи кода с этим оператором, если можно.

    Переменные в массиве содержат графическое изображение.

    Спасибо.

    Добавлено спустя 2 минуты 25 секунд:
    А, уточнение: выведя переменную, нужно ждать действия пользователя, потом выводить следующую и т.д :)
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Re: оператор, выводящий переменные массива в случайном поряд

    перемешать массив
    Код (Text):
    1. <?php
    2. shuffle($array);
    и по-очереди выводить
    Код (Text):
    1.  
    2. <?php
    3. foreach ($array as $img) ...
     
  3. Contessa

    Contessa Активный пользователь

    С нами с:
    8 мар 2012
    Сообщения:
    74
    Симпатии:
    0
    Re: оператор, выводящий переменные массива в случайном поряд

    А "shuffle" почему как оператор не выделяется цветом в notepage?
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Re: оператор, выводящий переменные массива в случайном поряд

    он из-за этого не перестанет работать
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: оператор, выводящий переменные массива в случайном поряд

    а потому что не надо работать в нотепаде (если конечно notepage это notepade)
     
  6. Contessa

    Contessa Активный пользователь

    С нами с:
    8 мар 2012
    Сообщения:
    74
    Симпатии:
    0
    Re: оператор, выводящий переменные массива в случайном поряд

    Ну оооооочень полезный комментарий! Лучше бы вы дали пример работающего кода, раз уж тратите свое время на такие бесплатные консультации.
    <?
    //выше в коде определены значения переменных массива как изображения
    $massiv = array("$1", "$2", "$3", "$4", "$5");
    shuffle($massiv);
    foreach ($massiv as $img) {
    echo ($massiv);
    }
    ?>
    Вот с вашей помощью написан такой код. И почему он не работает, уважаемые профи?
     
  7. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    потому что вот
    Код (PHP):
    1. foreach ($massiv as $img) {
    2. echo ($img);
    3. }
    4.  
     
  8. Contessa

    Contessa Активный пользователь

    С нами с:
    8 мар 2012
    Сообщения:
    74
    Симпатии:
    0
    Re: оператор, выводящий переменные массива в случайном поряд

    А как сделать чтобы он выводил по одной переменной из перемешанного массива пока они не закончатся?
     
  9. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Re: оператор, выводящий переменные массива в случайном поряд

    собственно я подвис, а что же оно сейчас делает?
     
  10. Contessa

    Contessa Активный пользователь

    С нами с:
    8 мар 2012
    Сообщения:
    74
    Симпатии:
    0
    Re: оператор, выводящий переменные массива в случайном поряд

    Код выводит все переменные из массива сразу, а должен по одной: сначала первую, потом после действий пользователя, вторую...и т.д.
     
  11. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Re: оператор, выводящий переменные массива в случайном поряд

    Собственно это значит что неясно донесена мысль до коллективного разума :)
    Ибо он работает правильно, он выводит все по одному из перемешенного массива.

    а вот как там задумывалось насчет действий пользователя такого уговору небыло.
     
  12. Contessa

    Contessa Активный пользователь

    С нами с:
    8 мар 2012
    Сообщения:
    74
    Симпатии:
    0
    Re: оператор, выводящий переменные массива в случайном поряд

    Перечитайте мой первый пост. Там есть уточнение :)
     
  13. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Re: оператор, выводящий переменные массива в случайном поряд

    А тут вопрос какое-же именно действие пользователя ждать надобно?
    Ибо, если там не требуется перезагрузка страницы, то тогда перекладывать это все на javascript, ибо php в данном вопросе уже не помощник.
    Если же страница перегружается, то просто в сессии сохранять индексы уже показанных элементов, и выбирать рандомом из тех, которые еще не отображались.
     
  14. Contessa

    Contessa Активный пользователь

    С нами с:
    8 мар 2012
    Сообщения:
    74
    Симпатии:
    0
    Re: оператор, выводящий переменные массива в случайном поряд

    >Если же страница перегружается, то просто в сессии сохранять индексы уже показанных элементов, и выбирать рандомом из тех, которые еще не отображались.

    Пример кода, плиз :)
     
  15. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    Re: оператор, выводящий переменные массива в случайном поряд

    Contessa, решений твоей задачи очень много. Нет смысла гадать что тебе нужно и перечислять все варианты решения.

    Ты просто скажи что ты хочешь получить, т.е. не саму задачу, а именно что должен увидеть пользователь и что он должен делать.
    Что это вообще такое: что-то типа опросника-теста? :)

    Скорее всего, я так думаю, к решению можно подойти "с другой стороны"
     
  16. Contessa

    Contessa Активный пользователь

    С нами с:
    8 мар 2012
    Сообщения:
    74
    Симпатии:
    0
    Re: оператор, выводящий переменные массива в случайном поряд

    Ну хорошо, вот тебе задача:
    выводим картинку (всего в массиве их больше полусотни) в случайном порядке, пользователь называет картинку
    (через поле input), говорим ему правильно он ответил или нет, выводим ему следующую.... по окончании теста можно и общий результат: сколько правильных ответов и сколько нет.
    >Что это вообще такое: что-то типа опросника-теста? :)
    Да, что-то типа теста.
    Какие будут идеи? С кодом, плиз.
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Re: оператор, выводящий переменные массива в случайном поряд

    Для этого надо перемешать массив
    Код (Text):
    1. shuffle($array);
    и записать сессию
    Код (Text):
    1. $_SESSION['array'] = $array;
    при загрузке страницы извлекать первый элемент с удалением
    Код (Text):
    1. echo array_shift($_SESSION['array']);
    http://phpfaq.ru/sessions
     
  18. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    Re: оператор, выводящий переменные массива в случайном поряд

    В общем вот накидал код небольшой. Всё прокомментировал. Код не старался оптимизировать, делал на скорую руку, только чтоб механизм "озвучить" :)

    Вот код:
    Код (Text):
    1. <?php
    2. session_start();
    3.  
    4. // Проверяем приходило ли что из формы
    5. $result = (isset($_REQUEST['result'])) ? $_REQUEST['result'] : null;
    6. $img = (isset($_REQUEST['img'])) ? $_REQUEST['img'] : null;
    7.  
    8. // Проверяем, а пришло ли что-нибудь
    9. if (!is_null($result) and !is_null($img)) {
    10.  
    11.     // Получаем результат из сессии
    12.     $itog = (isset($_SESSION['result'])) ? unserialize($_SESSION['result']) : array();
    13.  
    14.     // Добавляем результат
    15.     $itog[] = $img . ' - ' . $result;
    16.  
    17.     // Обновляем сессию с результатом
    18.     $_SESSION['result'] = serialize($itog);
    19. }
    20.  
    21. // Проверяем существует ли массив в сессии
    22. if (isset($_SESSION['array_img'])) { // Массив оказывается уже сформирован
    23.  
    24.     // униceриализуем массив из сессии
    25.     $array_img = unserialize($_SESSION['array_img']);
    26.  
    27. } elseif (isset($_SESSION['result'])) { // Массива уже нет или ещё нет но есть результат
    28.  
    29.     // Выводим результат
    30.     getResult();
    31.  
    32. } else { // Мы только начали листать опросник
    33.  
    34.     // Получаем новый массив (скорее всего это первый вход)
    35.     $array_img = getArray();
    36.  
    37. }
    38.  
    39. // Если ещё существуют записи в массиве
    40. if (isset($array_img[0])) {
    41.  
    42.     // Получаем первый элемент массива
    43.     $img = array_shift($array_img);
    44.  
    45.     // Проверяем массив ли это и не пустойли он
    46.     if (!is_null($img)) {
    47.  
    48.         // Выводим форму опросника
    49.         getForm($img, count($array_img));
    50.  
    51.         // Смотрим сколько осталось
    52.         if (count($array_img)) {
    53.  
    54.             // Обновляем данные
    55.             $_SESSION['array_img'] = serialize($array_img);
    56.  
    57.         } else {
    58.  
    59.             // Иначе удаляем
    60.             unset($_SESSION['array_img']);
    61.         }
    62.     }
    63. }
    64.  
    65. /**
    66.  * Функция выводит  форму опросника
    67.  *
    68.  * @param $img   - массив с картинками
    69.  * @param $count - количество элементов в массиве
    70.  */
    71. function getForm($img, $count)
    72. {
    73.     // Сама формочка
    74.     ?>
    75. <form action="index.php" method="post">
    76.     <h3>Осталось: <?php echo $count;?></h3>
    77.  
    78.     <div>
    79.         <img src="images/<?php echo $img;?>"/>
    80.     </div>
    81.     <div>
    82.         <select name="result">
    83.             <option value="0">Нет</option>
    84.             <option value="1">Да</option>
    85.         </select>
    86.     </div>
    87.     <input type="hidden" name="img" value="<?php echo $img;?>"/>
    88.  
    89.     <div>
    90.         <input type="submit" value="Дальше"/>
    91.     </div>
    92. </form>
    93. <?php
    94. }
    95.  
    96.  
    97. /**
    98.  * Получение массива путей картинок из папки
    99.  *
    100.  * @return array - массив путей картинок
    101.  */
    102. function getArray()
    103. {
    104.  
    105.     // Определяем постой массив
    106.     $result = array();
    107.  
    108.     // Определяем какие картинки искать (jpg, gif и т.п.)
    109.     $ext = 'jpg';
    110.  
    111.     // Получаем все картинки (пути) из каталога images
    112.     $files = scandir('images');
    113.  
    114.     // Оставляем в массиве нужное
    115.     foreach ($files as $file) {
    116.  
    117.         // Проверяем имя файла
    118.         $_tmp = preg_match('#(\.' . $ext . ')$#', $file);
    119.  
    120.         // Если оно то добавляем в массив
    121.         if ($_tmp) {
    122.             $result[] = $file;
    123.         }
    124.     }
    125.  
    126.     // Перемешиваем массив
    127.     shuffle($result);
    128.  
    129.     // Возвращаем массив с путями картинок
    130.     return $result;
    131. }
    132.  
    133. /**
    134.  * Выводим окончательный результат
    135.  */
    136. function getResult()
    137. {
    138.     echo '<div><h3>Итоги:</h3><ul>';
    139.     $array_result = (isset($_SESSION['result'])) ? unserialize($_SESSION['result']) : array();
    140.     foreach ($array_result as $result) {
    141.         echo '<li>' . $result . '</li>';
    142.     }
    143.     echo '</ul></div>';
    144.  
    145.     // Очищаем сессию
    146.     unset($_SESSION['array_img']);
    147.     unset($_SESSION['result']);
    148. }
    Теперь как запустить:
    - создаём в корне папку "images"
    - закидываем туда кучу JPEG-картинок с расширением jpg
    - ну и запускаем
     
  19. Contessa

    Contessa Активный пользователь

    С нами с:
    8 мар 2012
    Сообщения:
    74
    Симпатии:
    0
    Re: оператор, выводящий переменные массива в случайном поряд

    Полный бред. Такой код не будет работать и он не работает.
    Кто так вообще пишет?!
    ...
    ?>
    {
    <?php
    }
    ...
    Что за бред?
    Плохо работаете, программисты.
     
  20. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Re: оператор, выводящий переменные массива в случайном поряд

    Я огорчу, это не бред, это вполне себе набросок, да, спорный местами, но для примера самое то... и оно работает.
    Вопрос: что делаете не так?
     
  21. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    Re: оператор, выводящий переменные массива в случайном поряд

    Уважаемый, мне конечно обидно, но не за то, что я потратил достаточное количество времени и написал не только ответ на Ваш вопрос, а ещё и полное решение с загрузкой данных, перемешкой массива, с возможностью участия пользователя, выводом данных и общего результата. И обидно не за то, что Вы обозвали мой код бредом.

    А обидно за то, что Вы на столько ленивы, что не способны посмотреть даже на этом портале просто описание на русском(!) языке функций, которые работают с массивами. Что Вы на столько неграмотны, что не способны просто понять что Вам уже ответили. И за то, что Вы настолько бездарны, что не способны просто запустить скрипт у себя, в котором я специально прокомментировал для Вас каждую строчку кода и написал что нужно сделать дополнительно чтобы он заработал (хотя по коду и так понятно), при этом утверждая что это бред и код не рабочий.

    Если бы Вы действительно хотели бы понять, разобраться и научиться, то просто бы задали вопрос по непонятному моменту.

    Вы сами ответили на то, чтобы Вам в дальнейшем помогать. И мой совет, попробуйте пересмотреть своё отношение к помощи.

    Добавлено спустя 6 минут 52 секунды:
    Re: оператор, выводящий переменные массива в случайном порядке
    Кстати, можно обсудить. Я когда делал, было несколько вариантов решения, но посчитал оптимальным то что написал
     
  22. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Re: оператор, выводящий переменные массива в случайном поряд

    имхо unserialize - достаточно прожорлива до времени при больших массивах, тут или уж бросать все в json, или хранить просто массивом.
     
  23. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    Re: оператор, выводящий переменные массива в случайном поряд

    Да, думал над этим. Но не уверен что json оптимальнее. Нужно тесты проводить.. У меня была мысль сделать отдельный каталог для сессий и хранить всё в INI-файлах. Проводил тесты, скорость обработки просто бешеная, а сама обработка просто элементарная.
    А вот при работе с сессиями, действительно есть минус. Например если действие будет выбрано не пользователем или если браузер закроется или нужно вернуться назад.. В общем, у ini-файла много преимуществ.

    Была мысль завязать на базу, но это уже если сам проект использует базу, тогда стоит заморачиваться. А так просто усложнять получится
     
  24. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    Re: оператор, выводящий переменные массива в случайном поряд

    сделал тестик и сравнил json и serialize :) а последнее быстрее
    вот как проверял
    Код (Text):
    1. $array = array();
    2. for($i = 0; $i < 100000; $i++){
    3.     $array[] = 'Тестовое содержание массива - '. $i;
    4. }
    5. /***************************************************************************************/
    6. echo "<hr><h1>Загрузка (serialize)</h1>";
    7. $sys = microtime(true);
    8.  
    9. $res = serialize($array);
    10.  
    11. echo '<div>Скорость: ' . round((microtime(true) - $sys), 5) . '</div>';
    12. /***************************************************************************************/
    13. echo "<hr><h1>Выгрузка (unserialize)</h1>";
    14. $sys = microtime(true);
    15.  
    16. $res = unserialize($res);
    17.  
    18. echo '<div>Скорость: ' . round((microtime(true) - $sys), 5) . '</div>';
    19. /***************************************************************************************/
    20. echo "<hr><h1>Загрузка (json_encode)</h1>";
    21. $sys = microtime(true);
    22.  
    23. $res = json_encode($array);
    24.  
    25. echo '<div>Скорость: ' . round((microtime(true) - $sys), 5) . '</div>';
    26. /***************************************************************************************/
    27. echo "<hr><h1>Выгрузка (json_decode)</h1>";
    28. $sys = microtime(true);
    29.  
    30. $res = json_decode($res);
    31.  
    32. echo '<div>Скорость: ' . round((microtime(true) - $sys), 5) . '</div>';
    Вот результат:

    Загрузка (serialize)
    Скорость: 0.25258

    Выгрузка (unserialize)
    Скорость: 0.04428

    Загрузка (json_encode)
    Скорость: 1.04991

    Выгрузка (json_decode)
    Скорость: 0.33548
     
  25. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Re: оператор, выводящий переменные массива в случайном поряд

    прогони миллион :)
    сериалайз будет быстрее немного, а вот в обратную сторону очень медленнее.