#php #arrays #json #pagination
#php #массивы #json #разбивка на страницы
Вопрос:
У меня есть следующий код, но я не уверен, как зацикливать и смещать записи, чтобы получить следующие 20 записей, используя тот же цикл функций.
gameid равен нулю при первом вызове, а при втором вызове gameid равен 21.
$result = new ArrayObject();
$count = 0;
foreach($response as amp;$game) {
$game = get_object_vars($game);
if ($game['gameType'] == $gametype )
{
$result->append(array($game['gameName'], $game['gameType']));
if ($count == $gameid 19) break;
$count ;
}
}
Спасибо
Комментарии:
1. Это будет зависеть от того, что вы планируете делать
$response
после завершения цикла. Вы заполняете a$result
, что для меня говорит о том, что$response
в идеале ваш должен быть оставлен в такте, но вы преобразуете каждый его элемент. Почему? Если вам просто нужно разбить на страницы, то вы могли бы использовать что-то вродеforeach(array_slice($response, $offset, $limit) as $game) {
.2. Спасибо @RoAchterberg, но я не могу это использовать, потому что я хочу фильтровать по типу игры $game [‘gameType’] == $gametype
3. Тогда почему бы просто не выполнить фильтрацию
$response
сначала по этому условию, чтобы разбивать на страницы только массив элементов вашего конкретного игрового типа?
Ответ №1:
Я думаю, вам следует использовать концепцию размера страницы и индекса страницы.
В вашем случае кажется, что вам нужен размер страницы 20. Отправка второго запроса gameid
означает, что вам нужен размер страницы 20 и индекс страницы 1 (вместо 0).
Итак, рассмотрим такой код:
$count = 0;
$pageSize = 20; // this can be const or come as param
$pageIndex = 0; // this should be as params
foreach($response as amp;$game) {
$game = get_object_vars($game);
if ($game['gameType'] == $gametype ) {
$count ;
if ($count > ($pageSize * $pageIndex))
$result->append(array($game['gameName'], $game['gameType']));
// if you over the request chunk break
if ($count > ($pageSize * ($pageIndex 1)) break;
}
}