За последние 24 часа нас посетили 114958 программистов и 6576 роботов. Сейчас ищут 1772 программиста ...

цикл выдает рандом

Тема в разделе "PHP для новичков", создана пользователем shrekkk, 31 июл 2018.

  1. shrekkk

    shrekkk Новичок

    С нами с:
    31 июл 2018
    Сообщения:
    2
    Симпатии:
    0
    Ребят, оч тупой вопрос, но я совсем запутался и не понимаю. Суть в том, что мне нужно всегда на выходе получать лишь 2 строки стиха. Почему при выводе каждый раз выдает по разному кол-ву строк, если изначально у цикла стоит значение 1, а конец назначен на 2?



    PHP:
    1. $word1 = array('Чудесных', 'Суровых', 'Занятных', 'Внезапных');
    2. $word2 = array('слов', 'зим', 'глаз', 'дней', 'лет', 'мир', 'взор');
    3. $word3 = array('прикосновений', 'поползновений', 'судьбы явлений',
    4. 'сухие листья', 'морщины смерти', 'долины края', 'замены нету',
    5. 'сухая юность', 'навек исчезнув');
    6. $word4 = array('обретаю', 'понимаю', 'начертаю', 'закрываю', 'оставляю',
    7. 'вынимаю', 'умираю', 'замерзаю', 'выделяю');
    8. $word5 = array('очертания', 'безысходность', 'начертанья', 'смысл жизни',
    9. 'вирус смерти', 'радость мира');
    10.  
    11. $empty = " ";
    12.  
    13. for ($i=1; $i <= 2 ; $i++) {
    14.     $a = array_flip($word1);
    15.     $b = array_flip($word2);
    16.     $c = array_flip($word3);
    17.     $i = array_rand($a, 1) . $empty . array_rand($b, 1) . $empty . array_rand($c, 1);
    18.     echo "$i<br/>";
    19. }
     
  2. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    PHP:
    1. $word1 = array('Чудесных', 'Суровых', 'Занятных', 'Внезапных');
    2. $word2 = array('слов', 'зим', 'глаз', 'дней', 'лет', 'мир', 'взор');
    3. $word3 = array('прикосновений', 'поползновений', 'судьбы явлений',
    4. 'сухие листья', 'морщины смерти', 'долины края', 'замены нету',
    5. 'сухая юность', 'навек исчезнув');
    6. $word4 = array('обретаю', 'понимаю', 'начертаю', 'закрываю', 'оставляю',
    7. 'вынимаю', 'умираю', 'замерзаю', 'выделяю');
    8. $word5 = array('очертания', 'безысходность', 'начертанья', 'смысл жизни',
    9. 'вирус смерти', 'радость мира');
    10.  
    11. $words = [$word1, $word2, $word3, $word4, $word5];
    12. $count = count($words);
    13.  
    14. $text = null;
    15. $sep = ' ';
    16.  
    17.  
    18. for($i = 0; $i < $count; $i++) {
    19.     $text .= $sep . $words[$i][array_rand($words[$i])];
    20. }
    21.  
    22. echo $text;
     
    shrekkk нравится это.
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @shrekkk, для чего в 17-й строке переменную цикла перезаписываете?
     
  4. shrekkk

    shrekkk Новичок

    С нами с:
    31 июл 2018
    Сообщения:
    2
    Симпатии:
    0
    в моём понимании моя система должна была работать так, что на 17 строке, я расписываю как эта самая переменная i должна у меня выглядеть на выходе (из рандомных слов с первых 3 массивов) и повторяться должна 2 раза, для этого то я и создал цикл из 2 шагов, вот
    --- Добавлено ---
    благодарю! буду разбираться
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @shrekkk, а теперь сравните результат выражения в 17-й строке с числом 2.
     
    shrekkk нравится это.
  6. johovich

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

    С нами с:
    24 авг 2016
    Сообщения:
    146
    Симпатии:
    17
    Через жопу сделано потому что. Если у тебя $i для индекса, то не надо её под результирующую строку использовать. Ошибка в 17 строке. А если оценить вообще, то криво сделано.
    1. Зачем array_flip делать каждый раз в цикле? Это нужно вынести из цикла.
    2. Вообще array_flip здесь лишний. Тебе нужно получить рандомное значение из массива. Самый короткий путь:
    PHP:
    1. for ($i=1; $i <= 2 ; $i++) {
    2. echo $a[array_rand($a)].' '.$b[array_rand($b)].' '.$c[array_rand($c)].'<br/>';
    3. }
    P.S. Когда что-то работает не так, как ожидается, сначала нужно найти место возникновения ошибки. Бинарный поиск - самый быстрый способ для этого.
    Суть бинарного поиска в том, что ты все время делишь нечто пополам выбираешь половину в которой искомое тобой продолжает оставаться и дальше продолжаешь работу с этой половиной, потом с половиной половины и т.д. пока не найдешь проблему.

    На твоем коде. ошибка в цикле, поэтому сразу можно взять только эту часть. Убираешь половину кода и смотришь пропала ли ошибку. Если так сделать, то сразу понятно, что ошибка во второй половине цикла, так ты быстро бы наткнулся на свою 17 строку.
     
    #6 johovich, 31 июл 2018
    Последнее редактирование: 31 июл 2018
    shrekkk нравится это.