JQuery: выбираем из текстового файла несколько случайных строк и выводим их в документ
Как ответ на вопрос, да и пригодиться может:
а если я хочу выводить два значения со 100% вероятностью? их лучше запихать в один файл и первое брать с 1 по 100 строки, а 2 значение с 100 по 200 строк или распихать на два файла? не страшно, что функция будет срабатывать дважды?
Что изменится по отношению к этой статье, если нам не нужны "вероятности", а нужно просто выбирать и выводить n
случайных строк из набора, содержащегося в текстовом файле?
Сначала ответы на вопросы из цитаты.
Всегда лучше одно обращение к файловой системе, чем два или несколько, особенно при удалённом доступе к ней! Поэтому будем "вытаскивать" из прочитанного текстового файла несколько строк за один запрос.
Также напоминаю, что с большими объёмами данных лучше делать подобную задачу выбора нескольких записей через базу данных, как в этой заметке.
Третье замечание - код не рассчитан на "самые новые" версии JQuery, здесь хватит версии 1.2 из архива. :)
Не будем обновлять архив с исходным приложением, лишь перепишем код файлов index.html
и random.php
из него, учтя, по возможности, исключения.
Предусмотрим в разметке HTML контейнеры с идентификаторами myElement_1
, myElement_2
и т.д. для размещаемых случайных строк. В реальности эти контейнеры тоже можно создавать динамически, как, скажем, таблички в этом примере.
Вот как будут выглядеть изменённые файлы (с подробными комментариями).
Файл index.html
<!DOCTYPE html> <html lang="RU-ru"> <head> <title>Rnd</title> <meta charset="UTF-8"> </head> <body> <script type="text/javascript" src="jquery.js"></script> <p id="myElement_1"></p> <p id="myElement_2"></p> <script> function loadRandomString (prefix, n) { //Выбрать n случайных строк из файла на сервере и записать в элементы //с идентификаторами prefix_1, ..., prefix_n $.ajax({ type: "POST", url: "random.php", cache: false, datatype: "text", data: { n : n }, //Сколько строк вернуть success: function (result, status) { var arr = result.split("\n"), n = arr.length; //php-скрипт вернет строку, разделенную переводами строки \n for (var i = 0; i < n; i++) { var id = '#'+prefix+(i+1); //id элемента, куда писать if (!($(id).length)) break; //нет такого элемента - выйти из цикла $(id).html(arr[i]); //иначе записать значение } }, error: function (jqXHR, exception) { var msg = ''; //Сообщение об ошибке if (jqXHR.status === 0) msg = 'Not connect.\n Verify Network.'; else if (jqXHR.status == 404) msg = 'Requested page not found. [404]'; else if (jqXHR.status == 500) msg = 'Internal Server Error [500].'; else if (exception === 'parsererror') msg = 'Requested JSON parse failed.'; else if (exception === 'timeout') msg = 'Time out error.'; else if (exception === 'abort') msg = 'Ajax request aborted.'; else msg = "Uncaught Error.\n" + jqXHR.responseText; $('#'+prefix+1).html (msg); //Об ошибке пишем только в первый элемент } }); } window.addEventListener('load', function (e) { loadRandomString('myElement_',3); //Выведется 2 строки, т.к. имеем 2 элемента HTML! }, false); </script> <noscript><p>Включите Javascript для работы приложения!</p></noscript> </body> </html>
Заодно мы здесь детализировали сообщение об ошибке AJAХ в error: function
Файл random.php
<?php if (!isset($_POST['n']) or intval($_POST['n']) < 1) { echo 'N value error'; exit; } $n = intval($_POST['n']); //Передано допустимое целое $n>0 $filename = 'text.txt'; $data = @file ($filename); if ($data === FALSE) { echo 'File reading error'; exit; } $len = count ($data); //Сколько строк прочитано из файла? if ($len < 1) { echo 'Void file!'; exit; } $rand_keys = array_rand ($data, min($len,$n)); //Нельзя выбрать случайных значений больше, чем строк в файле $result = ''; //Строка-результат с разделителями-переводами строк $cnt = count ($rand_keys); //Сколько случайных значений выбрано из файла? if ($n == 1) { //При одном выбранном значении $rand_keys не возвращает массива echo trim($data[$rand_keys]); exit; } for ($i = 0; $i < $n; $i++) { //Всегда вернём $n значений, как просили if ($i < $cnt) $result .= trim($data[$rand_keys[$i]]); //Если ещё есть выбранные элементы, пишем их $result .= ($i < $n-1 ? "\n" : ""); //"Лишние" пополнятся просто пустыми строками } echo $result; ?>
12.06.2019, 13:24 [1564 просмотра]