Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 30/07/12 в 09:44 |
есть функция:
Код: [развернуть] |
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, но там и строк больше. Короче незнаю даже куда рыть.
Работает срипт локально у себя на компе, под виндой.
даже если перезапустить апач, выключить комп, похер. Рандом с этого фала будет постоянно таким.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 30/07/12 в 10:02 |
попробуй через shuffle перемешать массив
|
|
|
|
tuberotator.com
С нами с 12.09.06
Сообщения: 804
Рейтинг: 1478
|
Добавлено: 30/07/12 в 11:36 |
ibiz: +1
например так:
Код: [развернуть] |
function random($filename) {
$lines = file($filename);
shuffle($lines);
return $lines[0];
}
|
хотя если данных очень много более быстрым будет вариант вызова по случайному ключу.
|
|
|
|
С нами с 28.02.12
Сообщения: 1494
Рейтинг: 234
|
Добавлено: 30/07/12 в 14:56 |
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 30/07/12 в 17:21 |
генерит тоже с определенным периодом, т.е. так же повторы идут циклично.
то что предложили выше должно пойти, как освобожусь проверю
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 31/07/12 в 11:29 |
Nux писал: | ibiz: +1
например так:
Код: [развернуть] |
function random($filename) {
$lines = file($filename);
shuffle($lines);
return $lines[0];
}
|
хотя если данных очень много более быстрым будет вариант вызова по случайному ключу. |
тоже самое только теперь цикл повторов длинее стал
если был 8-10 то теперь 69-78
может как то сам код неправильно выстроен
вот сам код:
Код: [развернуть] |
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
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 31/07/12 в 16:55 |
Тест для иллюстрации проблемы и её решение.
Код: | 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".'" /> ';
}
}
$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' ); |
|
|
|
|
Текстовая реклама в форме ответа Заголовок и до четырех строчек текста Длина текста до 350 символов Купить рекламу в этом месте! |
|
Спонсор раздела
|