Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.09.2012, 10:52
Аспирант
Отправить личное сообщение для Allan Stark Посмотреть профиль Найти все сообщения от Allan Stark
 
Регистрация: 24.04.2010
Сообщений: 87

Определение последней итерации цикла.
Здравствуйте.
Имеется сценарий php, он делает ряд запросов к БД Firebird, на основании которых формирует довольно сложный (большое кол-во вложенности, разная структура "чилдренов") json вывод для скрипта на стороне клиента.

Вывод ведется на основании echo() из выборки по ibase_fetch_row(), т.е. сразу в поток, без предварительного формирования массивов и json_encode().

Вопрос.
Как исхитриться и определить конец последней итерации в каждом из циклов вида while ($row = ibase_fetch_row($db_fb_query)) {...} ?
Управляющие конструкции и условие по сравнению типа end() или next() по примеру http://dycore.blogspot.com/2010/03/foreach-php.html тут не катят, т.к. работаем не с массивом.

Определение последней итерации необходимо, чтобы выяснить, ставить ли в конце после некоторых "}" символ запятой или нет.

Создавать многомерные вложенные массивы и строить деревья будет сложновато, т.к. сценарий будет в будущем неоднократно модифицироваться. Выводить сперва в строку, а затем тримить ее справа на "," и затем отдавать в эху - тоже не совсем хорошо, строки могут быть очень длинные, потенциально можно упереться в прекомпиленное значение длины строкового типа 65539 на каком-нибудь хостинге...
Ответить с цитированием
  #2 (permalink)  
Старый 28.09.2012, 13:22
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

После цикла делайте rtrim(",") и всё
__________________
.
Ответить с цитированием
  #3 (permalink)  
Старый 28.09.2012, 13:43
Аспирант
Отправить личное сообщение для Allan Stark Посмотреть профиль Найти все сообщения от Allan Stark
 
Регистрация: 24.04.2010
Сообщений: 87

Сообщение от Skipp Посмотреть сообщение
После цикла делайте rtrim(",") и всё
Не получится, rtrim требует в качестве обязательного параметра входную строку, что мы ему передавать будем, если в сценарии вывод в поток на отдачу сразу через echo идет, без промежуточного сохранения/сбора строки для вывода.
Ответить с цитированием
  #4 (permalink)  
Старый 28.09.2012, 13:48
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

эмм, а почему не собирать в одну строку? В чём проблема? Просто вы так как минимум делаете лишние телодвижения, так как есть разница у одного echo и тысячи echo.

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

Последний раз редактировалось Skipp, 28.09.2012 в 13:50.
Ответить с цитированием
  #5 (permalink)  
Старый 28.09.2012, 13:53
Аспирант
Отправить личное сообщение для Allan Stark Посмотреть профиль Найти все сообщения от Allan Stark
 
Регистрация: 24.04.2010
Сообщений: 87

В строку собрать нельзя, т.к. прекомпиленный php по дефолту имеет (если память не изменяет) ограничение для строкового типа в 65539.
100% можно будет в будущем нарваться на хостинг с таким ограничением...
Ответить с цитированием
  #6 (permalink)  
Старый 28.09.2012, 13:54
Аспирант
Отправить личное сообщение для Allan Stark Посмотреть профиль Найти все сообщения от Allan Stark
 
Регистрация: 24.04.2010
Сообщений: 87

Общее кол-во записей в ibase к сожалению получить невозможно без предварительного прогона "впустую" запроса (и подсчета кол-ва выданных строк в цикле), аналога того же mysql_num_rows() в php для него просто нет...
Ответить с цитированием
  #7 (permalink)  
Старый 28.09.2012, 14:17
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Если я не ошибаюсь, то в php нету ограничения на длину строки, кроме как объём оперативки, но есть ограничение буфера вывода.
И вот есть такое решение для echo
__________________
.
Ответить с цитированием
  #8 (permalink)  
Старый 28.09.2012, 14:22
Аспирант
Отправить личное сообщение для Allan Stark Посмотреть профиль Найти все сообщения от Allan Stark
 
Регистрация: 24.04.2010
Сообщений: 87

Хм, возможно вы и правы.
Просто когда-то натыкался на явное ограничение в работе строковых функций с длинными строками...
Ответить с цитированием
  #9 (permalink)  
Старый 28.09.2012, 14:27
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Allan Stark,
Вот допустим тут написано тоже самое
__________________
.
Ответить с цитированием
  #10 (permalink)  
Старый 28.09.2012, 14:28
Аспирант
Отправить личное сообщение для Allan Stark Посмотреть профиль Найти все сообщения от Allan Stark
 
Регистрация: 24.04.2010
Сообщений: 87

И здесь тоже:
http://php.ua/blog/2012-01-16/preg_m...E%D0%BA%D0%B8/

Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как отобразить в окне значения счетчика во время выполнения цикла FOR Алекс97 Общие вопросы Javascript 5 06.09.2008 10:36