Скрипт для выбора 8ми рандомных строк без повторений

Тема в разделе "PHP", создана пользователем Damasc, 10 янв 2011.

Модераторы: latteo
  1. Damasc

    Damasc

    Регистр.:
    5 мар 2009
    Сообщения:
    173
    Симпатии:
    6
    Очень нужна ваша помощь.

    Пишу небольшой модуль, нужно чтобы он выводил из .txt файла 8 рандомных строк, но не делал повторений.

    Написал скрипт который выводит 1 строку:
    PHP:
    <?php
    if(!defined('DATALIFEENGINE'))
    {
    die(
    "Hacking attempt!");
    }
    $rndlines_file '/rndlines.txt';
    $rndlines_lines file($rndlines_file);
    $rndlines $rndlines_lines[rand(0count($rndlines_lines) - 1)];
    echo 
    $rndlines;
    ?>
    Как сделать чтобы скрипт выводил 8 строк и исключал повторения при выборе? Я так понимаю тут делается массивом, но моих знаний пока не достаточно.
     
  2. Miraage

    Miraage Angular/Laravel

    Регистр.:
    3 июн 2008
    Сообщения:
    230
    Симпатии:
    51
    PHP:
    <?php
    # Получаем строки. file() не ок, да и мой метод быстрее
    $fd fopen('/rndlines.txt''rt');
    $lines explode("\n"fread($fdfilesize('/rndlines.txt')));
    $count count($lines);
    # Проверяем кол-во строк
    if ($count 8) { /* тут можно эксепшн бросить */ }
    # Строки, которые мы уже выбрали
    $hitted = array();
    # Запускаем цикл
    while (count($hitted) < 8) {
        
    $random rand(0$count 1);
        if (empty(
    $hitted[$random])) {
            
    $hitted[$random] = $lines[$random];
        }
    }
    $hitted - массив с 8 строками. делай с ним, что хочешь
     
    Damasc нравится это.
  3. Damasc

    Damasc

    Регистр.:
    5 мар 2009
    Сообщения:
    173
    Симпатии:
    6
    Если я верно понимаю, код должен работать превосходно и так:
    PHP:
    <?php
    # Получаем строки. file() не ок, да и мой метод быстрее
    $fd fopen('http://test1.ru/rndlines.txt''rt');
    $lines explode("\n"fread($fdfilesize('http://test1.ru/rndlines.txt')));
    $count count($lines);
    # Проверяем кол-во строк
    if ($count 8) {  }
    # Строки, которые мы уже выбрали
    $hitted = array();
    # Запускаем цикл
    while (count($hitted) < 8) {
        
    $random rand(0$count 1);
        if (empty(
    $hitted[$random])) {
            
    $hitted[$random] = $lines[$random];
        }

    echo 
    $hitted;
    ?>
    _http://test1.ru - локал хост денвера.
    ошибка:
    Код:
    Warning: filesize() [function.filesize]: stat failed for http://test1.ru/rndlines.txt in Z:\home\test1.ru\www\1.php on line 4
    Warning: fread() [function.fread]: Length parameter must be greater than 0 in Z:\home\test1.ru\www\1.php on line 4
    Fatal error: Maximum execution time of 30 seconds exceeded in Z:\home\test1.ru\www\1.php on line 12
     
  4. VandJ

    VandJ

    Регистр.:
    8 апр 2008
    Сообщения:
    318
    Симпатии:
    113
    PHP:
    <?php
    $rndlines_lines 
    file('rndlines.txt');
    shuffle ($rndlines_lines); //shuffle -- Перемешивает массив
    for($i=0;;$i++) {if ($i==8){break;} else {echo $rndlines_lines[$i].'<br>';}}
    ?>
     
    Damasc нравится это.
  5. Damasc

    Damasc

    Регистр.:
    5 мар 2009
    Сообщения:
    173
    Симпатии:
    6
    Идеально работает, спасибо большое! буду дальше изучать PHP

    Буду благодарен если подскажете как результат выполнения скрипта вывести в табличку

    4 по ширине, 2 по высоте.

    Тут я тоже не совсем понимаю как это сделать. В одну линию всё понятно, а вот как быть со 2м рядом в таблице?
     
  6. VandJ

    VandJ

    Регистр.:
    8 апр 2008
    Сообщения:
    318
    Симпатии:
    113
    PHP:
    <table border ="1"><tr>
    <?php
    $rndlines_lines 
    file('rndlines.txt');
    shuffle ($rndlines_lines); //shuffle -- Перемешивает массив
    for($i=0;;$i++) 
    {
        if (
    $i==8){break;} else 
        {
            echo 
    '<td>'.$rndlines_lines[$i].'</td>'; if ($i==3) echo '</tr>';
        }
    }
    ?>
    </table>
     
    Damasc нравится это.
  7. Delk0

    Delk0

    Регистр.:
    26 мар 2010
    Сообщения:
    284
    Симпатии:
    47
    PHP:
    <?php
    $rndlines_lines 
    file('rndlines.txt');
    shuffle ($rndlines_lines); //shuffle -- Перемешивает массив
    echo '<table border ="1"><tr>';
    for(
    $i=0;$i<8;$i++) 
    {
       echo 
    '<td>'.$rndlines_lines[$i].'</td>';
       if (
    $i==3) echo '</tr><tr>';
    }
    echo 
    '</tr></table>';
    ?>

     
    Damasc нравится это.