Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
21 / 10 / 4
Регистрация: 02.04.2015
Сообщений: 779

Что не так у меня с циклом

09.03.2018, 11:48. Показов 1226. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, подскажите что не так с циклом?
Почему парсится только 1000 и не осуществляется переход на седующий пакет (2000)

вроде должно парсить сказала 1000, потом вторую тысячу циклом, третюю и так до конца пока не закончится ид в count



PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
 
// Номер пакета запроса
$packet = 0;
 
// Размер пакета запроса
$limit = 1000;
 
do {
// Каждый запрос начинаем там, где остановились в предыдущем запросе.
$offset = $packet * $limit;
 
 
 
// Выполнение запроса.
$link = "https://api.vk.com/method/groups.getMembers?group_id=habr&offset=$offset&version=5.27";
$contents = file_get_contents($link); //получаем
$member = json_decode($contents); //декодим
 
 
// забираю ид учасников и вывожу
foreach($member->response->users as $drizi){    
echo "$drizi<br>";
}
 
 
// Переходим на следующий пакет.
$packet++;
} while ($member['response']['count'] > $offset + $limit);
 
?>
Добавлено через 1 минуту
должно спарсится 728168 учасников

Добавлено через 1 минуту
парсится только первая тысяча, и не идет цикл продолжения
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.03.2018, 11:48
Ответы с готовыми решениями:

Что у меня не так?
Здраствуйте уважаемые програмисты! У меня вот такой вопрос. Почему у меня на веб сервере (собственная сборка и такой как zend server ce)...

Что у меня не так? выводит ошибку
Здравствуйте, есть сайт авторизации/регистрации с выводом капчи и задержкой времени. При заходе на страницу авторизации выдает ошибку на...

Просьба проверить програмку. Что то у меня не получается с циклом
#include&lt;iostream&gt; #include&lt;clocale&gt; #include&lt;cstdlib&gt; #include&lt;ctime&gt; using namespace std; int main() { setlocale...

16
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
09.03.2018, 12:53
Не выполняется условие
PHP
1
while ($member['response']['count'] > $offset + $limit)
Исследуйте значения этих переменных в конце итерации.
0
21 / 10 / 4
Регистрация: 02.04.2015
Сообщений: 779
09.03.2018, 13:00  [ТС]
Цитата Сообщение от Зверушь Посмотреть сообщение
Исследуйте значения этих переменных в конце итерации.
что именно?

echo $member['response']['count'] > $offset + $limit;
не выводит ничего
0
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
09.03.2018, 13:18
PHP
1
2
3
4
5
6
7
echo '<pre>';
var_dump($member['response']['count']); // или var_dump($member) - увидите всю переменную мембер
var_dump($offset);
var_dump($limit);
var_dump($member['response']['count'] > $offset + $limit);
echo '</pre>';
exit();
0
21 / 10 / 4
Регистрация: 02.04.2015
Сообщений: 779
09.03.2018, 13:35  [ТС]
сделал так, нет никакого вывода кроме первой тысячи ид...

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
 
// Номер пакета запроса
$packet = 0;
 
// Размер пакета запроса
$limit = 1000;
 
do {
// Каждый запрос начинаем там, где остановились в предыдущем запросе.
$offset = $packet * $limit;
 
 
 
// Выполнение запроса.
$link = "https://api.vk.com/method/groups.getMembers?group_id=habr&offset=$offset&version=5.27";
$contents = file_get_contents($link); //получаем
$member = json_decode($contents); //декодим
 
 
// забираю ид учасников и вывожу
foreach($member->response->users as $drizi){    
echo "$drizi<br>";
}
 
 
 
// Переходим на следующий пакет.
$packet++;
} while ($member['response']['count'] > $offset + $limit);
 
 
echo '<pre>';
var_dump($member['response']['count']); // или var_dump($member) - увидите всю переменную мембер
var_dump($offset);
var_dump($limit);
var_dump($member['response']['count'] > $offset + $limit);
echo '</pre>';
exit();
 
?>

я не пойму что нужно этим выводом добится


мне нужно чтобы работала такая логика


первым циклом
PHP
1
2
3
4
5
$packet = 0;
 
foreach($member->response->users as $drizi){    
echo "$drizi<br>";
}

я забираю первые 1000 ид



далее значение в переменной увеличивалось на 1
$packet = 1;

и так далее
PHP
1
2
3
4
$packet = 2;
$packet = 3;
$packet = 4;
$packet = 5;
......
и пока не спарсю все ид
0
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
09.03.2018, 13:36
Цитата Сообщение от serauto79 Посмотреть сообщение
сделал так, нет никакого вывода кроме первой тысячи ид...
все что вывело скопируйте сюда.
0
21 / 10 / 4
Регистрация: 02.04.2015
Сообщений: 779
09.03.2018, 14:45  [ТС]
просто по ссылке
https://api.vk.com/method/grou... rsion=5.27
можно забрать за раз только 1000 ид
по ссылке
https://api.vk.com/method/grou... rsion=5.27
вторую тысячу ид
и так далее при увеличении значения пока не спарсю все ид

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


6
10
11
17
24
34
47
55
57
84
161
169
239
251
260
341
345
347
и так далее

Добавлено через 1 час 1 минуту
ну кто поможет а?
0
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
09.03.2018, 15:47
Цитата Сообщение от serauto79 Посмотреть сообщение
я же сказал что ничего не вывело, выводит только то то и было изначально первая тысяча ид и всеееееееее
6
10
11
17
24
34
47
55
57
84
161
169
239
251
260
341
345
347
и так далее
Не верю! Не может быть такого вывода. Как мнимум типы переменных вывод покажет, и вар дампов всего 4, после чего exit(). Не может быть столько строк.

Добавлено через 1 минуту
Эти строки у вас вывел
PHP
1
echo "$drizi<br>";
Добавлено через 28 секунд
Если дальше вообще ничего нет, то включите вывод ошибок....
0
21 / 10 / 4
Регистрация: 02.04.2015
Сообщений: 779
09.03.2018, 18:42  [ТС]
Цитата Сообщение от Зверушь Посмотреть сообщение
echo "$drizi<br>";
да, этот цикл

просто не идет повторение нижнего условия
// Переходим на следующий пакет.
$packet++;
} while ($member['response']['count'] > $offset + $limit);

и работа скрипта тормозится на парсинге 1000 ид

Добавлено через 4 минуты
сейчас выводит ошибку

Fatal error: Cannot use object of type stdClass as array in /var/www/groop.php on line 39

вот эта строка

PHP
1
} while ($member['response']['count'] > $offset + $limit);
Добавлено через 1 минуту
Неустранимая ошибка: нельзя использовать объект типа stdClass как массив
0
 Аватар для otto-fukin
14 / 60 / 21
Регистрация: 15.06.2017
Сообщений: 572
09.03.2018, 19:06
вы json разворачиваете как объект, а потом пытаетесь этот объект мучить как массив
0
21 / 10 / 4
Регистрация: 02.04.2015
Сообщений: 779
09.03.2018, 19:29  [ТС]
хорошо как все исправить тогда помогите.
0
 Аватар для otto-fukin
14 / 60 / 21
Регистрация: 15.06.2017
Сообщений: 572
09.03.2018, 19:35
PHP
1
$member = json_decode($contents,true); //декодим
PHP
1
foreach($member['response']['users'] as $drizi){
возможно как-то так, хотя я без понятия что там vk присылает

Добавлено через 2 минуты
и запрашиваете вы сначала все записи, ночитаете только первую тыщу, потом почти все начиная со второй тыщи и читаете опять только одну тыщу.. нерационально как-то. наверняка в контакте есть лимит по присылаемым пакетам
0
21 / 10 / 4
Регистрация: 02.04.2015
Сообщений: 779
09.03.2018, 19:41  [ТС]
ну так я и написал что лимит 1000 за раз, так бы тему не поднял тут, ладно вижу такие спецы как и я
0
 Аватар для otto-fukin
14 / 60 / 21
Регистрация: 15.06.2017
Сообщений: 572
09.03.2018, 19:45
Цитата Сообщение от serauto79 Посмотреть сообщение
что лимит 1000 за раз
так нафига вы с вконтакте 700 тыщь запрашиваете чтобы только тыщу прочитать? и так 700 раз планируете? круто
Цитата Сообщение от serauto79 Посмотреть сообщение
такие спецы как и я
спецы не спецы, а справку по json читать умеем, да и цифры считать тоже
0
21 / 10 / 4
Регистрация: 02.04.2015
Сообщений: 779
09.03.2018, 22:13  [ТС]
Цитата Сообщение от otto-fukin Посмотреть сообщение
так нафига вы с вконтакте 700 тыщь запрашиваете чтобы только тыщу прочитать? и так 700 раз планируете? круто
вам бы лижбы написать
откройте у себя в браузере
https://api.vk.com/method/grou... rsion=5.27

count":728250
означает что в этой группе 728250 чел..

и потом идет выдача этих людей, за раз апи отдает 1000 чел это лимит
вывод начинается с наименьшого ид.


в ссылке есть параметр offset=0

это означает что вывод будет первые 1000 ид, выведет до ид к примеру 45654

если в параметре offset=1000
укажу 1000 то вывод ид будет начинатся с ид 45655 и до 124444

и так далее...

Добавлено через 1 час 9 минут
АБББББР ВОЛК..

Добавлено через 57 минут
Мда.... абррр волк не сработал, ну тогда "пивная еще парочку"
0
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
10.03.2018, 09:22
Лучший ответ Сообщение было отмечено serauto79 как решение

Решение

serauto79, у вас не выполняется условие цикла от того и первая итерация только выполняется. Я вам показал как дебажить, не можете, ну и ладно...

Последний раз говорю, надо вот так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
 
// Номер пакета запроса
$packet = 0;
 
// Размер пакета запроса
$limit = 1000;
 
do {
// Каждый запрос начинаем там, где остановились в предыдущем запросе.
$offset = $packet * $limit;
 
 
 
// Выполнение запроса.
$link = "https://api.vk.com/method/groups.getMembers?group_id=habr&offset=$offset&version=5.27";
$contents = file_get_contents($link); //получаем
$member = json_decode($contents); //декодим
 
 
// забираю ид учасников и вывожу
foreach($member->response->users as $drizi){    
echo "$drizi<br>";
}
 
 
 
// Переходим на следующий пакет.
$packet++;
 
echo '<pre>';
var_dump($member);
var_dump($offset);
var_dump($limit);
var_dump($member['response']['count'] > $offset + $limit);
echo '</pre>';
exit();
 
} while ($member['response']['count'] > $offset + $limit); 
?>
Вар дампы надо всовывать перед while, неужели не понятно было с самого начала?

НО! Вангую (вот и посмотрим какой из меня пророк), что $member не массив а объект stdClass, тогда условие должно быть такое:
PHP
1
} while ($member->response->count > $offset + $limit);
Попробуйте сначала это условие. Если не заработает - вставьте вар дампы с примера выше и выложите сюда все, что вывелось между тегами <pre></pre>. На var_dump($member['response']['count'] > $offset + $limit); скорее всего выкинет ошибку, закидывайте ее тоже сюда. Посмотрим весь вывод.
1
21 / 10 / 4
Регистрация: 02.04.2015
Сообщений: 779
10.03.2018, 10:22  [ТС]
спасибо конечно но я вчера уже по другому сделал, все ровно этот код не сможет спарсить все за раз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.03.2018, 10:22
Помогаю со студенческими работами здесь

Что не так с циклом if-else if?
Первый язык, изучаю полтора месяца и захотелось написать программу которая вычисляет идеальный вес... Нашел формулу расчета идеального...

Что-то не так с циклом
string main_array = System.IO.File.ReadAllLines(&quot;../../TextFile1.txt&quot;); string subarray = main_array.Split(' '); ...

Что не так с циклом?
что не так с циклом..вдыает ошибку? Program Funkcia; Var x,s,k,n,a:real; Begin X:=1.28; S:=0; For k:=1 to 5 do ...

что не так с этим циклом
var a = {a:3,b:6,c:9}; var keys = Object.keys(a); var i = 0; while(i&lt;keys.length){ if(a] == 3) {continue;} else...

Правильно ли? Что не так с оператором и циклом?
Я потерялась и запуталась,почему не пишет попала ли я иль нет? &quot;Для десяти выстрелов, координаты которых задаются с клавиатуры, написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru