Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Рандомная выдача.
цитата
30/07/12 в 09:44
 Lexikon
есть функция:

function random($filename) {                               
$lines = file($filename);
return $lines[array_rand($lines)];
}


у меня есть несколько файлов откуда эта функция в процессе работы цикла должна рандомно тянуть строки.
Но вот проблема, она тянет всегда одно и тоже, т.е. если в файле будет сотни строк
она будет тянуть только порядка 10 одних и тех-же.
Х.з как это обойти и почему это проискодит.
Если эту функцию запускать отдельно от всего то она работает нормально
а вот в общем скрипте не хочет так.
Файл из 74 строк, в скрипте рандом выдается так
57
31
25
5
22
26
20
и сново
57
31
25
и т.д.
тут цикличность через 7 в другом файле эта цикличность через 3, но там и строк больше. Короче незнаю даже куда рыть.
Работает срипт локально у себя на компе, под виндой.
даже если перезапустить апач, выключить комп, похер. Рандом с этого фала будет постоянно таким.
цитата
30/07/12 в 10:02
 ibiz
попробуй через shuffle перемешать массив trollface.png
цитата
30/07/12 в 11:36
 Nux
ibiz: +1

например так:

function random($filename) {                               
$lines = file($filename);
shuffle($lines);
return $lines[0];
}


хотя если данных очень много более быстрым будет вариант вызова по случайному ключу.
цитата
30/07/12 в 14:56
 pipez
php может древнее 4.2.0 стоит?

попробуй генератор случайных чисел запустить вначале

Цитата:
srand((float) microtime() * 10000000);


http://php.su/functions/?array-rand
цитата
30/07/12 в 17:21
 Lexikon
pipez писал:
php может древнее 4.2.0 стоит?

попробуй генератор случайных чисел запустить вначале



http://php.su/functions/?array-rand


генерит тоже с определенным периодом, т.е. так же повторы идут циклично.

то что предложили выше должно пойти, как освобожусь проверю icon_biggrin.gif
цитата
31/07/12 в 11:29
 Lexikon
Nux писал:
ibiz: +1

например так:

function random($filename) {                               
$lines = file($filename);
shuffle($lines);
return $lines[0];
}


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


тоже самое только теперь цикл повторов длинее стал
если был 8-10 то теперь 69-78
может как то сам код неправильно выстроен icon_sad.gif

вот сам код:


set_time_limit(0);                                                 // Снимаем ограничение времени на работу скрипта.

require_once "syn.php";
   
$width          = $_POST[ 'width' ];                                    // Ширина видео и изображения.
$height          = $_POST[ 'height' ];                                   // Высота видео и изображения.
$impData          = $_POST[ 'exdata' ];                                   // Данные из главного окна формы.
$seperated       = $_POST[ 'seperated' ];                              // Разделитель.
$expData          = "expdata.dat";                                     // Файл в который будут записываться экспортные данные.
$tagsFile         = "tags.txt";                                    // Файл с Тегами.
$keysFile         = "keys.txt";                                    // Файл с Кивордами.
$linksFile         = "links.txt";                                    // Файл с Тайтлами на платник.
$topTitleFile      = "toptitle.txt";                                  // Файл с Тайтлами для продолжения "Watch FREE..."
$face             = file_get_contents("embed.tpl");                      // Получить содержимое файла в виде одной строки.

$lines          = explode( "\n", $impData );                           // Разбиваем полученные строковые данные из формы на подстроки.
$count          = count( $lines );                                       // Считаем коичество элементов массива для цикла.


function random($filename) {                                        // ФУНКЦИЯ ДЛЯ РАНДОМНОЙ ВЫДАЧИ ДАННЫХ.
$lines = file($filename);
shuffle($lines);
return $lines[0];
}
                                                                                  // ------------------------------------------------

function getLimitText($text, $limit) {                                         // ФУНКЦИЯ ОГРАНИЧЕНИЯ ТЕКСТА.
$strlen = strlen($text);
     if ($strlen > $limit)
     {
             $text = preg_replace( "/[\r\n\t]/", "", $text );
              $str = '';
              $text = substr( $text, 0, $limit );
              $words = explode( " ", $text );
              $k = count($words) - 1;
              $n = 0;
              while ($n < $k)
           {             
              $str .= $words[$n++].' ';             
              }
           $text = trim($str)."...";
     }
     else    
     {
     $text = trim($text);
     }
     return $text;
}
                                                                                  // ------------------------------------------------

function getStr($str) {                                                   // ФУНКЦИЯ РЕДАКТИРОВАНИЯ ОКОНЧАНИЯ ПРЕДЛОЖЕНИЯ.
$str = trim($str);
if ( ($str{strlen($str)-1} == '.') or ($str{strlen($str)-1} == '!') or ($str{strlen($str)-1} == '?') ) {
$str;
}
elseif ( ($str{strlen($str)-1} == ',') or ($str{strlen($str)-1} == ':') or ($str{strlen($str)-1} == ';') ) {
$str = substr($str,0,-1);
$str = $str.".";
}
else {
$str = $str.".";
}
return $str;
}
                                                                                // ------------------------------------------------
                                                            
function domain($str){                                                         // ФУНКЦИЯ ПОЛУЧЕНИЯ ДОМЕНА ИЗ URL.
$domain = parse_url($str);
$domain = $domain['host'];
$arr_domain = explode(".", $domain);
$res = array_reverse($arr_domain);
$result = "$res[1].$res[0]";
$result = strtolower($result);
return $result;
}
                                                                                // ------------------------------------------------

                                                            

for( $i = 0; $i < $count; $i += 1 )                                    // Запускаем цикл для обработки данных из главного окна формы.
{
$content          = $face;
                                                                                    // Функцией explode() разбиваем строку на подстроки и list() присваеваем значения списку переменных.
list($flv, $img, $titleMain, $descMain, $paySite) = explode( $seperated, stripslashes($lines[ $i ]) );

$cPaySite          = urlencode( $paySite );                               // кодированный URL платника для ембед.

$titleMainShort    = getLimitText($titleMain, 200);                     // создаем ограниченную длину тайтла для создания имен будущих файлов (т.к. длина имяни файла в windows не должна превышать 255 символов).

$titleMainShort    = syn($titleMainShort);
$descMain         = syn($descMain);

$gCode          = substr(md5(microtime(true)), 0, 3);
$getDomain       = domain($paySite);

  // ----  Start: Обработка Title ----
 
$titleMainShort    = str_replace("&", "and", $titleMainShort);                         // Заменяем '&' на 'and'.
$titleMainShort   = preg_replace("/[^A-Za-z0-9\s-!.,:;?']/", "", $titleMainShort );       // Удаляем лишнии символы из текста.
$fileName          = strtolower( preg_replace( '/\s+/', '-', trim( preg_replace("/[^A-Za-z0-9\s]/", "", $titleMainShort ) ) ) ); // Удаляем символы кроме Пробела Лат. букв и цифр, заменяем пробелы на тире, переводим сё в нижний регистр.
$fileName         = $fileName.'-'.$getDomain.'-'.$i.$gCode;                      // Создаем уникальность названия для предотвращения совпадений (имя файла по тайтлу+домен платника+номер строки обработки+случайный трехсимвольный код)

$titleMain         = getStr($titleMain);

$titleTP          = getLimitText($titleMain, 35);
$titleEmbed       = getLimitText($titleMain, 70);

// ----  End: Обработка Title ----

// ----  Start: Обработка Desccription ----

$descMain        = str_replace("&", "and", $descMain);                         // Заменяем '&' на 'and'.
$descMain        = preg_replace("/[^A-Za-z0-9\s-!.,:;?']/", "", $descMain );       // Удаляем лишнии символы из текста.

$descMain         = getStr($descMain);                                    

$metaDesc          = getLimitText($descMain, 120);
$embedDesc       = getLimitText($descMain, 400);

// ----  End: Обработка Desccription ----

// ----  Start: Созание строки тегов ----

$tags = ""; // Объявляем переменную пустой.
for( $z = 0; $z<=3; $z++ ) // Запускаем цикл.
{
   $rand_tags = random($tagsFile);
   $rand_tags = trim($rand_tags); // Убираем возможные пробелы из начала и конца строк.
   $tags .= $rand_tags.", "; // Разделяем наращиваемые слова запятыми.
}
$tags = substr($tags, 0, strlen($tags) - 2)."."; // Заменяем последнии два символа (запятая, пробел) на одну точку.

// ----  End: Созание строки тегов ----

// ----  Start: Получение случайноко киворда ----

   $keyWord = random( $keysFile );
   $keyWord = ucfirst($keyWord).".";

// ----  End: Получение случайноко киворда ----

// ----  Start: Получение случайноко тайтла для ссылки на платник ----

   $linksTitle = random( $linksFile );

// ----  End: Получение случайноко тайтла для ссылки на платник ----

  // ----  Start: Получение случайноко тайтла для продолжения "Watch FREE..." ----

   $topTitle = random( $topTitleFile );
   $topTitle = ucwords($topTitle);

// ----  End: Получение случайноко тайтла для продолжения "Watch FREE..." ----

     // с помощью preg_replace() выполняем поиск и замену по РЕГУЛЯРНОМУ ВЫРАЖЕНИЮ в файле-шаблоне заданом в переменной $content
   $content = str_replace('{flv}', $flv, $content);
   $content = str_replace('{img}', $img, $content);
   $content = str_replace('{titleTP}', $titleTP, $content);
   $content = str_replace('{titleEmbed}', $titleEmbed, $content);
   $content = str_replace('{keyWord}', $keyWord, $content);
   $content = str_replace('{metaDesc}', $metaDesc, $content);
   $content = str_replace('{embedDesc}', $embedDesc, $content);
   $content = str_replace('{fileName}', $fileName, $content);
   $content = str_replace('{width}', $width, $content);
   $content = str_replace('{height}', $height, $content);
   $content = str_replace('{cPaySite}', $cPaySite, $content);
   $content = str_replace('{tags}', $tags, $content);
   $content = str_replace('{linksTitle}', $linksTitle, $content);
   $content = str_replace('{topTitle}', $topTitle, $content);
   $content = str_replace('{paySite}', $paySite, $content);
   $content = preg_replace("/[\r\n]/", "", $content );
   
   // Открыть текстовый файл
   $f = fopen($expData, "a");
   // Записываем строку данных (каждая запись с новой строки)
   fwrite($f, $content. "\r\n");
   // Закрыть текстовый файл
   fclose($f);
}

echo "Done!";



ПХП установлен версии 5.0.4
цитата
31/07/12 в 16:55
 Yacc
Тест для иллюстрации проблемы и её решение.



Код:
function array_random_from_file( $file, $count ) {
    $random = false;
    if( $array = file( $file ) and $count > 0 and $count <= count( $array ) ) {
        $random_indexes = array_rand( $array, $count );
        if( $count == 1)
            $random_indexes = array( $random_indexes );
        $random = array();
        foreach( $random_indexes as $i )
            $random[] = $array[ $i ];
    }
    return $random;
}

function array_random_from_file_2( $file, $count ) {
    if( $random = array_random_from_file( $file, $count ) )
        shuffle( $random );
    return $random;
}

function test( $file, $width, $height, $method ) {
    for( $n = 3; $n <= $width; $n *= 10 ) {
        $random = array();
        for( $i = 0; $i < $width / $n; $i += 1 )
            foreach( $method( $file, $n ) as $r )
                $random[] = $r;
        $img = imagecreatetruecolor( $width, $height );
        $color = imagecolorallocate( $img, 255, 255, 255 );
        for( $x = 0; $x < $width; $x += 1 )
            imagesetpixel( $img, $x, $height - $random[ $x ], $color );
        imagestring( $img, 5, 20, 20, $method, $color );
        imagestring( $img, 4, 20, 40, $n.' from '.$width, $color );
        $id = uniqid();
        imagejpeg( $img, "test/$id.jpg" );
        imagedestroy( $img );
        echo '<img src="'."test/$id.jpg".'" />&nbsp;';
    }
}

$file = realpath( dirname( __FILE__ ) ).DIRECTORY_SEPARATOR.'data.txt';
$height = 300;
$width = $height;
$array = array();
for( $i = 0; $i < $height; $i += 1 )
    $array[] = $i;
file_put_contents( $file, implode( "\n", $array ) );

test( $file, $width, $height, 'array_random_from_file' );
echo '<hr/>';
test( $file, $width, $height, 'array_random_from_file_2' );


Эта страница в полной версии