Нужна помощь с include

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

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

    FlashBack Супер -человек

    Регистр.:
    7 май 2007
    Сообщения:
    318
    Симпатии:
    45
    Нужна помощь, в php я нуб, ниже найденный мной скрипт, он вставляет
    рандомную строку из file.txt
    Код:
    <?
    $data = file("http://site/file.txt");
    $total = count($data);
    srand(double)microtime()*1000000);
    $mn = 1; // min
    $mx = 2; // max
    $text = "";
    for($i=0; $i<mt_rand($mn,$mx); $i++) {
     $s = mt_rand(0,$total-1);
     $text .= "".$data[$s];
     }
     echo "$text";
     ?>
    подгружается в шаблон includ'ом:

    Код:
    <?php include ("filename.php"); ?>
    но ничего не происходит(

    что делаю не так или может где ошибка в скрипте?

    Заранее спасибо за помощь.
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    код хоть и ужасный начала 2000 года и пхп3, но вродь работать должен. Но всё же использовать лучше более приличные методы например

    Перейти по ссылке
    Перейти по ссылке
    Перейти по ссылке

    к примеру
    PHP:
    function getRandomStr($file){
     
             
    $data file$file ); 
             
    $total count($data); 
     
              
    $s mt_rand(0$total-1); 

      return  
    trim($data[$s])  ;
    }

    в шаблоне написать
    <?php echo getRandomStr($file); ?>
     
    FlashBack нравится это.
  3. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    KillDead - почему пользуешь count(), а не sizeof()?
     
  4. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    304
    Симпатии:
    98
    потому что sizeof вернет размер файла
    а count - кол-во элементов в массиве
    надо ли говорить что функция file на выходе отдает массив, состоящий из строковых данных (в отличие от file_get_contents, возвращающей файло цельным куском)?
     
  5. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Неа, мимо, читай маны, если не веришь прочитанному пробуешь на практике.

    p.s.: thoth777 подогнал блин, перепугался думал уже начал функции путать, и пора на пенсию, шутник елки пали. Но видимо функции путаю не я ;).
     
  6. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    304
    Симпатии:
    98
    отнюдь.
    внимательно читните тему: ТС надо "рандомную строку из file.txt"

    и да, предложу ТС свой вариант кода, как это сделал бы я.



    $data = file("http://site/file.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
    $total = count($data);

    $mn = 1; // min
    $mx = 2; // max
    $i=mt_rand($mn,$mx);
    $text = "";
    while ($i>0){
    $shuffle($data);
    $s = $data[0];
    $text .= $data[$s];
    $i--;
    }
    echo $text;

    если важно чтобы строки не повторялись
    то можно вместо
    shuffle($data);
    $s = $data[0];

    использовать
    $s = array_shift($data);

    а shuffle($data); закинуть до начала блока while



    оч важная херь, которой незаслуженно пренебрегают: FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES
    тута описалово:
    http://ru.php.net/manual/en/function.file.php


    ЗЫ. за конструкции типа echo "$text"; надо бить программиста клавиатурой по рукам!

    ззы
    не работать может еще вот что:

     
    FlashBack нравится это.
  7. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    2trooll
    действительно, хотя написано что This function is an alias of: count(). но sizeof быстрее работает. Но разница такая, что не особо можно и волноваться на этот счёт.
    2thoth777 скопировал выше что такое функция sizeof их мана пхп. Дельное замечание насчёт флажков. Вообще ,в идеале я бы советовал сделать
    1)Если мы берём постоянно строку из файла, то файл нужно нормализовать, те привести к виду, коорый не надо будет каждый раз парсить на пустые строки и тп
    2) shuffle($data); будет вести себя неоправданно медленно для больших файлов даже если он один.
    3) предусмотреть многократный вызов функции, а то сейчас файл постоянно открывается.
     
  8. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    304
    Симпатии:
    98
    KillDead, отнюдь:
    sizeof работает не быстрее и не медленнее чем count

    про shuffle замечание верное (тормоза при большом объеме)

    берем array_rand
    соответственно юзаем его

    $r=array_rand($data,1);
     
  9. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    Нет, нет, отнюдь. Если честно хз как в новых версиях >5.3, не тестил, но вы видели что я написал?
    ненамного но быстрее. Хотя и является зеркалом. Либо у всех поголовно погрешность измерений была выше в сторону sizeof...

    + array_rand тоже хорошо, но если массив не менялся я бы предложил запомнить количество элементов в массиве, а затем выбирать случайное mt_rand
    НО , для тз скорость не играет большой роли, тк не думаю что именно этот кусок будет тормазить. А если он занимает всего ~1% времени генерации- оптимизировать его не нужно.
     
  10. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    304
    Симпатии:
    98
    простите, но у кого "у всех"?

    фразами "давно известно", "все говорят" можно предварить любую чушь.

    а если я заявлю что "все говорят что вы безбожно обманываете, утверждая что sizeof выполняется быстрее чем count", например?

    и да, у меня есть чем доказать.


    PHP:
    <?php
    srand
    (time());
    $test=array();
    for (
    $i=0$i<1000$i++){
    $test[]=rand(0,1000);
    }

    $iterations=200;

    echo 
    "Count\n";
    $now=microtime(true);
    for (
    $a=0$a<$iterations$a++){
        for (
    $b=0$b<$iterations$b++){
            for (
    $c=0$c<$iterations$c++){
                if (
    count($test)<2){echo "test";}
            }
        }
    }
    $andnow=microtime(true);
    echo 
    $andnow-$now."\n--------------------\n";

    echo 
    "Sizeof\n";
    $now=microtime(true);
    for (
    $a=0$a<$iterations$a++){
        for (
    $b=0$b<$iterations$b++){
            for (
    $c=0$c<$iterations$c++){
                if (
    sizeof($test)<2){echo "test";}
            }
        }
    }
    $andnow=microtime(true);
    echo 
    $andnow-$now."\n--------------------\n";
    ?>

    этот пассаж:
    if (sizeof($test)<2){echo "test";}
    добавлен на случай какого-либо оптимизатора, смотрящего неиспользуемые вычисляемые данные.
    echo "test" естественно выполняться не будет :)


    вот что мой скрипт показал (запускал несколько раз, менял местами проверку для count и sizeof)

    Count
    13.442732095718
    --------------------
    Sizeof
    13.53715801239
    --------------------

    но в одном вы правы: count и sizeof неравнозначны по времени выполнения.

    век живи, век учись, например.
     
    SergXP нравится это.