Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: foreach задать начало и конец выполнения.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
bombording
Отправлено: 17 Ноября, 2013 - 09:53:40
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Добрый день!
Имеется цикл, который добавляет данные в массив. Мне необходимо сделать вывод данных постранично. Для этого необходимо задать циклу начало и конец выполнения.

PHP:
скопировать код в буфер обмена
  1.        
  2.         // в эти переменные передаем постом, на какой странице мы находимся.
  3.         $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
  4.         // сколько записей выводить на странице
  5.         $rows = 10;
  6.  
  7.         $offset = ($page-1)*$rows;
  8.  
  9. $ar = array();
  10. // начало
  11. $i = 0;
  12.     foreach($html->find('#table tr') as $a){
  13.         // это некое условие при котром обрабатывается массив
  14.         if (@$a->find('td',0)->plaintext) {
  15.                 $o = new stdClass();
  16.                 $o->date=date('F j, Y', strtotime($a->find('td a',0)->plaintext));
  17.                 $o->slow=$a->find('td',2)->plaintext;
  18.                 $arr[] = $o;
  19.         }
  20.         // задаем конец выполнения цикла
  21.        if(++$i == ($rows+$offset)) break;
  22.     }
  23.  


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

Например:

1 страница
В цикл попадают записи с 0 по 10

2 страница
В цикл попадают записи с 10 по 20

и т.д.

(Отредактировано автором: 17 Ноября, 2013 - 09:55:23)

 
 Top
DelphinPRO
Отправлено: 17 Ноября, 2013 - 10:41:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




вам не цикл нужно ограничивать, а выбирать только нужные данные в него.
При выборе из БД данный вопрос решается с помощью оператора LIMIT


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
bombording
Отправлено: 17 Ноября, 2013 - 10:46:11
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




DelphinPRO пишет:
вам не цикл нужно ограничивать, а выбирать только нужные данные в него.
При выборе из БД данный вопрос решается с помощью оператора LIMIT

Это верно. Но в данном случае работает парсер (DOM), и данные берутся не из SQL а из обычного html....в этом то и вся сложность.

Не хотелось бы отказываться от постраничного вывода, может быть есть способ сделать это в цикле?

(Отредактировано автором: 17 Ноября, 2013 - 10:47:38)

 
 Top
likvidator
Отправлено: 17 Ноября, 2013 - 10:49:54
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


Может глупость скажу,но все же: а если попробовать через WHILE?
PHP:
скопировать код в буфер обмена
  1.  
  2. while($i++<count($html->find('#table tr'))){
  3. };

Просто увеличивайте значение $i
(Добавление)
даже
PHP:
скопировать код в буфер обмена
  1.  
  2. $page=4;
  3. $pp=10;
  4. $need=$page*$pp;
  5. while($need++<$need+10))){
  6. };
  7.  

(Отредактировано автором: 17 Ноября, 2013 - 10:55:21)

 
 Top
bombording
Отправлено: 17 Ноября, 2013 - 10:55:02
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




likvidator пишет:
Может глупость скажу,но все же: а если попробовать через WHILE?
PHP:
скопировать код в буфер обмена
  1.  
  2. while($i++<count($html->find('#table tr'))){
  3. };

Просто увеличивайте значение $i

count($html->find('#table tr')) у меня ровно 350.

Тут будет немного другое. На первой странице будут все 350 записей и с каждой страницей они будут уменьшаться на $i...
 
 Top
likvidator
Отправлено: 17 Ноября, 2013 - 10:55:43
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


переделал
(Добавление)
ии? устроит? Только там принцип поменяется,когда будете брать данные из массива
 
 Top
bombording
Отправлено: 17 Ноября, 2013 - 11:03:47
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




likvidator пишет:
переделал

Что то не пойму куда while прописать....в сам foreach?

Делаю так, цикл отрабатывается весь но данных в массиве нету.
PHP:
скопировать код в буфер обмена
  1.  
  2.         $page =1;
  3.         $rows =10;
  4.         $offset = ($page-1)*$rows;
  5.  
  6.  
  7.     foreach($html->find('#table tr') as $a){
  8.         if (@$a->find('td',0)->plaintext) {
  9.             while($offset++<$offset+10){
  10.                 $o = new stdClass();
  11.                 $o->date=date('F j, Y', strtotime($a->find('td nobr a',0)->plaintext));
  12.                 $o->slow=$a->find('td',2)->plaintext;
  13.                 $arr[] = $o;
  14.             }
  15.         }
  16.        //if(++$i == $rows) break;
  17.     }
 
 Top
likvidator
Отправлено: 17 Ноября, 2013 - 11:07:43
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


нет...форыч вообще не нужен в этом случае..хотя.можете дать дамп,хотя бы примерный
?

(Отредактировано автором: 17 Ноября, 2013 - 11:19:31)

 
 Top
bombording
Отправлено: 17 Ноября, 2013 - 11:19:13
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




likvidator пишет:
нет...форыч вообще не нужен в этом случае..хотя.можете дать дамп,хотя бы примерный
?

Там выводятся найденные теги tr в таблице:

CODE (html):
скопировать код в буфер обмена
  1.   <table>
  2.   <tr>
  3.     <td>1</td>
  4.     <td><nobr><a href="http://link11">2013-11-11</a></nobr></td>
  5.     <td><a href="http://link21">Excel</a> </td>
  6.   </tr>
  7.  
  8.   <tr>
  9.     <td>2</td>
  10.     <td><nobr><a href="http://link21">2013-11-12</a></nobr></td>
  11.     <td><a href="http://link22">Excel</a> </td>
  12.   </tr>
  13. </table>

Всего тегов tr 350 штук.

Далее уже обрабатываются теги td которые находятся в tr и загоняются в массив

PHP:
скопировать код в буфер обмена
  1.         if (@$a->find('td',0)->plaintext) {
  2.                 $o = new stdClass();
  3.                 $o->date=date('F j, Y', strtotime($a->find('td nobr a',0)->plaintext));
  4.                 $o->slow=$a->find('td',2)->plaintext;
  5.                 $arr[] = $o;
  6.         }
 
 Top
likvidator
Отправлено: 17 Ноября, 2013 - 11:20:36
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


вы не поняли... сделайте и дайте:
 
 Top
bombording
Отправлено: 17 Ноября, 2013 - 11:26:59
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




likvidator пишет:
вы не поняли... сделайте и дайте:

Оно выдает только Array(), причем я указываю print_r.

Данную комманду $html->find('#table tr') обрабатывает известная библиотека парсинга HTML_DOM
PHP:
скопировать код в буфер обмена
  1. include 'simple_html_dom.php';
  2.  
  3. $url = "test.htm";
  4. $html = file_get_html($url) or die("Could not access site: $url");
  5.  
 
 Top
likvidator
Отправлено: 17 Ноября, 2013 - 11:32:41
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


А ваш код
PHP:
скопировать код в буфер обмена
  1.  
  2. // в эти переменные передаем постом, на какой странице мы находимся.
  3.  
  4.         $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
  5.  
  6.         // сколько записей выводить на странице
  7.  
  8.         $rows = 10;
  9.  
  10.  
  11.  
  12.         $offset = ($page-1)*$rows;
  13.  
  14.  
  15.  
  16. $ar = array();
  17.  
  18. // начало
  19.  
  20. $i = 0;
  21.  
  22.     foreach($html->find('#table tr') as $a){
  23.  
  24.         // это некое условие при котром обрабатывается массив
  25.  
  26.         if (@$a->find('td',0)->plaintext) {
  27.  
  28.                 $o = new stdClass();
  29.  
  30.                 $o->date=date('F j, Y', strtotime($a->find('td a',0)->plaintext));
  31.  
  32.                 $o->slow=$a->find('td',2)->plaintext;
  33.  
  34.                 $arr[] = $o;
  35.  
  36.         }
  37.  
  38.         // задаем конец выполнения цикла
  39.  
  40.        if(++$i == ($rows+$offset)) break;
  41.  
  42.     }

отрабатывает как надо?
 
 Top
bombording
Отправлено: 17 Ноября, 2013 - 11:35:52
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




likvidator пишет:
А ваш код
PHP:
скопировать код в буфер обмена
  1.  
  2. // в эти переменные передаем постом, на какой странице мы находимся.
  3.  
  4.         $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
  5.  
  6.         // сколько записей выводить на странице
  7.  
  8.         $rows = 10;
  9.  
  10.  
  11.  
  12.         $offset = ($page-1)*$rows;
  13.  
  14.  
  15.  
  16. $ar = array();
  17.  
  18. // начало
  19.  
  20. $i = 0;
  21.  
  22.     foreach($html->find('#table tr') as $a){
  23.  
  24.         // это некое условие при котром обрабатывается массив
  25.  
  26.         if (@$a->find('td',0)->plaintext) {
  27.  
  28.                 $o = new stdClass();
  29.  
  30.                 $o->date=date('F j, Y', strtotime($a->find('td a',0)->plaintext));
  31.  
  32.                 $o->slow=$a->find('td',2)->plaintext;
  33.  
  34.                 $arr[] = $o;
  35.  
  36.         }
  37.  
  38.         // задаем конец выполнения цикла
  39.  
  40.        if(++$i == ($rows+$offset)) break;
  41.  
  42.     }

отрабатывает как надо?


Да, все хорошо работает. С начало находится #table tr, затем все td из каждого tr загоняются в массив.

Комманда if(++$i == ($rows+$offset)) break; Останавливает выполнение цикла в положенном месте.
 
 Top
likvidator
Отправлено: 17 Ноября, 2013 - 12:14:29
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


Ну не зная вид и тип данных я мало чем помогу. С чего начать я написал,дальше дело за вами.
 
 Top
DelphinPRO
Отправлено: 17 Ноября, 2013 - 14:08:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




bombording пишет:
Но в данном случае работает парсер (DOM), и данные берутся не из SQL а из обычного html....в этом то и вся сложность.

нет здесь никакой сложности. используйте цикл for

PHP:
скопировать код в буфер обмена
  1.  
  2. $start = 0;
  3. $end = 12;
  4. $rgData = $html->find('#table tr');
  5.  
  6. for($i = $start; $i <= $end; $i++){
  7.         $a = $rgData[$i];
  8.         // это некое условие при котром обрабатывается массив
  9.         if (@$a->find('td',0)->plaintext) {
  10.                 $o = new stdClass();
  11.                 $o->date=date('F j, Y', strtotime($a->find('td a',0)->plaintext));
  12.                 $o->slow=$a->find('td',2)->plaintext;
  13.                 $arr[] = $o;
  14.         }
  15. }

(Добавление)
кстати эту часть можно так переписать:

PHP:
скопировать код в буфер обмена
  1. if (@$a->find('td',0)->plaintext) {
  2.     $arr[] = (object) array(
  3.         'date' => date('F j, Y', strtotime($a->find('td a',0)->plaintext)),
  4.         'slow' => $a->find('td',2)->plaintext,
  5.     );
  6. }

(Отредактировано автором: 17 Ноября, 2013 - 14:08:56)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB