Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2017, 09:39   #1
helken
 
Регистрация: 22.01.2017
Сообщений: 7
По умолчанию Ошибка Notice: Undefined offset: 0 - PHP

Добрый день!

Я не опытный программист, требуется небольшая помощь в решении ситауции!

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

Данный скрипт работает, но время от времени выдает ошибку:

Notice: Undefined offset: 0 on line 12

Итак, как работает скрипт:

1. Он берет список файлов из определенной папки и случайным образом выбирает один файл (в папке содержится около 2000 текстовых файлов, количество файлов постоянно меняется)
2. Из выбранного файла он берет случайную строку (все файлы разного размера с разным количеством строк, но в основном размер файлов колеблется от 5 Мб. до 50 Мб.)
3. Полученную строку он выводит на экран монитора.

Я прекрасно понимаю, что Notice - это не ошибка а предупреждение и ее можно смело заглушить, но проблема в том, что при возникновении этого предупреждения ничего на экран не выводится а нам требуется чтобы всегда выводилась случайная строка из файла при каждом перезагрузке страницы.

Я перерыл большое количество литературы и читал много ответов по этой "ОШИБКЕ" но ничего не могу сделать.

Пробовал оборачивать в Get и POST но результатов не дало.

Возможно есть другое решение или может ктото посоветует использовать какойто другой движок для сайта случайного вывода.

Забегая вперед скажу, что база строк занимает 10 Гб. Т.е. выборку нужно делать из 10 Гб. текстовых строк разной длины.

Возможно есть какоето решение с базой данных mysql или какойто движок сайта, который можно использовать под данную задачу?

А Вот и сам код:
PHP код:
<?php
//указываем папку с файлами
$folder 'полный путь к папке с txt файлами';
$files = array();
$files scandir($folder);
//выбираем случайный файл из папки
$files_rand $files[rand(0,sizeof($files)-1)];
//выбираем случайную строку из файла
$all_str file($folder.'/'.$files_rand);
$i rand(0,sizeof($all_str)-1);
//выводим строку
echo $all_str[$i];
?>
Заранее благодарен!
helken вне форума Ответить с цитированием
Старый 22.01.2017, 11:53   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

PHP код:
function randomString($files$folder){
    
//выбираем случайный файл из папки 
    
$files_rand $files[rand(0sizeof($files)-1)];
    
//выбираем случайную строку из файла 
    
$all_str file($folder '/' $files_rand);
    
$i rand(0sizeof($all_str)-1);
    
//выводим строку – если она существует в массиве, и не пуста
    
if(!empty($all_str[$i])){
        echo 
$all_str[$i]; 
        return;
    }
    else{
        
// иначе – вызываем функцию повторно
        
randomString($files$folder);
    }
}

//указываем папку с файлами 
$folder 'полный путь к папке с txt файлами'
$files scandir($folder); 
randomString($files$folder); 
P.S.: и нужно бы добавить проверки на '.', '..' и каталоги в результатах работы scandir().

Последний раз редактировалось Andkorol; 22.01.2017 в 12:03.
Andkorol вне форума Ответить с цитированием
Старый 22.01.2017, 12:11   #3
helken
 
Регистрация: 22.01.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
PHP код:
function randomString($files$folder){
    
//выбираем случайный файл из папки 
    
$files_rand $files[rand(0sizeof($files)-1)];
    
//выбираем случайную строку из файла 
    
$all_str file($folder '/' $files_rand);
    
$i rand(0sizeof($all_str)-1);
    
//выводим строку – если она существует в массиве, и не пуста
    
if(!empty($all_str[$i])){
        echo 
$all_str[$i]; 
        return;
    }
    else{
        
// иначе – вызываем функцию повторно
        
randomString($files$folder);
    }
}

//указываем папку с файлами 
$folder 'полный путь к папке с txt файлами'
$files scandir($folder); 
randomString($files$folder); 
P.S.: и нужно бы добавить проверки на '.', '..' и каталоги в результатах работы scandir().
Благодарю Вас, а как еще можно добавить проверку на на '.', '..' и каталоги в результатах работы scandir() ?
helken вне форума Ответить с цитированием
Старый 22.01.2017, 12:36   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

http://php.net/manual/ru/function.is-file.php может решить этот вопрос.
Andkorol вне форума Ответить с цитированием
Старый 22.01.2017, 13:10   #5
helken
 
Регистрация: 22.01.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
http://php.net/manual/ru/function.is-file.php может решить этот вопрос.
А зачем мне проверять папку?

Как я понимаю нужно проверить строки на пустоту?
helken вне форума Ответить с цитированием
Старый 22.01.2017, 13:15   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от helken Посмотреть сообщение
А зачем мне проверять папку?

Как я понимаю нужно проверить строки на пустоту?
Затем, что получить строку из папки весьма проблематично.
А из файла – легко.
Вот перед тем, как получать строку – неплохо бы убедиться, что мы пытаемся получить её именно из файла, а не из папки.
Для этого и пригодится is_file.
Andkorol вне форума Ответить с цитированием
Старый 22.01.2017, 13:23   #7
helken
 
Регистрация: 22.01.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Затем, что получить строку из папки весьма проблематично.
А из файла – легко.
Вот перед тем, как получать строку – неплохо бы убедиться, что мы пытаемся получить её именно из файла, а не из папки.
Для этого и пригодится is_file.
Поставил Ваш скрипт, прогнали 10000 раз ни одной ошибки не вылетело!

Работает безупречно!!!

СПАСИБО ОГРОМНОЕ!!!

Стоит ли мудрить с проверкой на на '.', '..' и каталоги в результатах работы scandir()
helken вне форума Ответить с цитированием
Старый 22.01.2017, 13:38   #8
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от helken Посмотреть сообщение
Стоит ли мудрить с проверкой на на '.', '..' и каталоги в результатах работы scandir()
Зависит от структуры проекта.
Если наличие подкаталогов внутри целевого каталога с файлами исключено – то не стоит.
'.' и '..' можно исключить, просто изменив стартовую позицию для rand() с 0 на 2 (при определении файла для получения контента).
Andkorol вне форума Ответить с цитированием
Старый 22.01.2017, 13:47   #9
helken
 
Регистрация: 22.01.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Зависит от структуры проекта.
Если наличие подкаталогов внутри целевого каталога с файлами исключено – то не стоит.
'.' и '..' можно исключить, просто изменив стартовую позицию для rand() с 0 на 2 (при определении файла для получения контента).
Итак решение найдено!!!

Всем СПАСИБО!

Дано:
1. бесплатный хостинг с поддержкой php 5.6
2. Папка объемом 10 ГБ. с файлами в кол-ве 2000 шт. средним размером в 30 Мб.

Нужно:
1. из папки выбрать случайный файл
2. Выбрать, из выбранного случайного файла, случайную строку.

РЕШЕНИЕ:

Код:
function randomString($files, $folder){
    //выбираем случайный файл из папки 
    $files_rand = $files[rand(0, sizeof($files)-1)];
    //выбираем случайную строку из файла 
    $all_str = file($folder . '/' . $files_rand);
    $i = rand(0, sizeof($all_str)-1);
    //выводим строку – если она существует в массиве, и не пуста
    if(!empty($all_str[$i])){
        echo $all_str[$i]; 
        return;
    }
    else{
        // иначе – вызываем функцию повторно
        randomString($files, $folder);
    }
}
 
//указываем папку с файлами 
$folder = 'полный путь к папке с txt файлами'; 
$files = scandir($folder); 
randomString($files, $folder);
В ИТОГЕ:

1. Прогнали данный скрипт 100000 раз
2. Ошибок не обнаружено!
helken вне форума Ответить с цитированием
Старый 29.01.2017, 10:33   #10
helken
 
Регистрация: 22.01.2017
Сообщений: 7
По умолчанию

Andkorol

Подскажите пожалуйста а как теперь результат работы вывести в нескольких частях страницы?

Я имею ввиду как полученный результат echo $all_str[$i]; вывести в разных частях страницы?

Другими словами, мне нужно чтобы было примерно так:

<h1> <?php echo $all_str[$i]; ?> </h1>
<hr>
<br>
<h3 style="text-align: center;">
<a href="/searchs/?tag=<?php echo $all_str[$i]; ?>" target="_blank" style="color: rgb(0, 0, 255); font-style: italic;"><?php echo $all_str[$i]; ?></a>
</h3>

Последний раз редактировалось helken; 29.01.2017 в 10:47. Причина: добавил понимания
helken вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Notice: Undefined variable, помогите найти ошибку Женя32 PHP 12 13.10.2016 21:03
Ошибка Notice: Use of undefined constant feramount PHP 1 07.08.2013 05:09
В чем проблема? - Notice: Undefined variable onleon PHP 1 03.07.2010 11:37
Ошибка Notice: Undefined offset: 2 Ruska882009 Помощь студентам 1 18.11.2009 15:16