LINUX.ORG.RU

PHP, что-то вроде деления с остатком

 , ,


0

1

Хочу сделать одну вещь. Допустим у меня будут массивы в массиве. Те самые массивы содержат одну страницу. В странице таблица допустим по 15 строк. И в общем суть проблемы вот в чем: ведь строк не всегда будет нужное количество. Если их 45, то и выведутся три страницы по 15 строк. Но а что если 56? Как сделать так чтобы последний массив содержал остаток(в данном случае 11)?

Знаю что вопрос нубский, но лично я не могу решить задачу.


Может, я неправильно понял условие, но в PHP нет проблемы, вложенные массивы могут содержать разное число элементов.

$a=array(array('a','b','c'),array('d','e','f'),array('g'));
foreach($a as $page)
{
echo "<HR>";
foreach ($page as $record)
echo $record."<BR>";
}

sholom
()

Если их 45, то и выведутся три страницы по 15 строк. Но а что если 56? Как сделать так чтобы последний массив содержал остаток(в данном случае 11)?

$data = [ .. ];

$page = 4;
$items_per_page = 15;

$total_pages = ceil(count($data) / $items_per_page);

$data_on_page = array_slice($data, $items_per_page*($page-1), $items_per_page);
KRoN73 ★★★★★
()
Ответ на: комментарий от sholom

Нет, это я понимаю. Но я хочу сделать вот что.

Допустим имеется общий массив который содержит другие массивы. Эти массивы содержат по 15 значений. Но последний массив должен содержать не 15, а другое значение(если число элементов не делится на 15 без остатка), этот самый остаток.

ozzee
() автор топика

Не очень понятно чего ты хочешь все таки.

Кроме приведенной уже математики, есть еще:

$input_array = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($input_array, 2));
print_r(array_chunk($input_array, 2, true));


может тоже пригодится.

А так - напиши пример, чего ты хочешь.

BaBL ★★★★★
()
Ответ на: комментарий от KRoN73

Зачем $total_pages если он не используется? Тогда уж:

$data = [ ... , ... ];
$itemsPerPage = 15;

$fullPages = (int)(count($data) / $itemsPerPage);

$lastPage = array_slice($data, $fullPages * $itemsPerPage);

example

xSudo ★★★
()
Последнее исправление: xSudo (всего исправлений: 2)
Ответ на: комментарий от xSudo

Зачем $total_pages если он не используется?

Например, чтобы вывести список числа страниц.

$fullPages = (int)(count($data) / $itemsPerPage);

Ошибка. В случае полного заполнения страниц последняя страница будет пустая :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Radjah

А там целочисленного деления нет? // пых не изучал

Целочисленного деления нет, но есть приведение к целому (int) и функции round/floor/ceil.

KRoN73 ★★★★★
()
Ответ на: комментарий от BaBL

напиши пример, чего ты хочешь

В общем у меня в базе данных хранятся ссылки(к примеру). Я вывожу их в таблице. Но ссылок может быть и 1000 и 10000. Я хочу сделать деление на страницы. В одном массиве - количество страниц. В другом - эти самые страницы(а точнее записи из БД). Допустим на одной странице будут выводиться 15 элементов. Но может быть и число не равное 15-ти. Поэтому надо формировать последнюю страницу из остатка. Т.е. остались 3 элемента, последняя страница будет содержать три элемента.

ozzee
() автор топика
Ответ на: комментарий от KRoN73

Например, чтобы вывести список числа страниц.

А, ну я просто имел в виду, что на данном этапе она не нужна.

Ошибка. В случае полного заполнения страниц последняя страница будет пустая

Не будет. full в смысле полные страницы. Дальнейшая реализация уже зависит от разработчика. Можно к примеру сравнивать

$fullPages c (ceil(count($data) / $items_per_page))

Или

if($lastPage){
    $totalPages = $fullPages + 1;
}
Вариантов масса

xSudo ★★★
()
Ответ на: комментарий от ozzee

Ты может не заметил, но написал то же самое что и ОП. Это нифига не проясняет в чем у тебя проблема. Почему ты не можешь засунуть в массив меньше 15 элементов?

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

Короче. Хрен с ним. Объяснить нормально не смогу, так что постараюсь сам разобраться.

Всем спасибо за решения.

ozzee
() автор топика
Последнее исправление: ozzee (всего исправлений: 1)

array pad ?

зачем тебе такой тупняк? - это проблема не массива ...

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

anonymous
()
Ответ на: комментарий от xSudo

Не будет. full в смысле полные страницы.

Я просто не стал цитировать код целиком :) Если точнее, то ошибка в:

$lastPage = array_slice($data, $fullPages * $itemsPerPage);

Если у нас массив из 20 элементов и 10 на страницу, то fullPages = 2 и тут у нас попытка вывести с 20 элемента.

if($lastPage) $totalPages = $fullPages + 1;

А тут две кривости — некрасивое условие, которое не нужно, поскольку задача чисто математическая и нарушение логики, потому что для 20 элементов на 10 страницах получится totalPages=3, что не так :)

Мой же вариант работает на чистой арифметике и вполне логично. Можно выкинуть даже «некрасивое» page-1, если страницы нумеровать с нуля.

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

Ну я же похапешник) Лишь хотел показать на пальцах.

xSudo ★★★
()
Ответ на: комментарий от KRoN73

попытка вывести с 20 элемента

Это не ошибка, в lastPage будет пустой массив, а вот уже ниже он отсеивается.

if($lastPage) $totalPages = $fullPages + 1;

А тут две кривости — некрасивое условие, которое не нужно, поскольку задача чисто математическая и нарушение логики, потому что для 20 элементов на 10 страницах получится totalPages=3, что не так :)

Ну на счёт некрасивости дело вкуса, а так как при 20 элементов и 10 на страницу в $lastPage будет пустой массив, то условие if($lastPage) просто не сработает.

Мой же вариант работает на чистой арифметике и вполне логично.

В том то и дело, что не вполне логично, так как нужно вручную задавать количество страниц $page

http://sandbox.onlinephpfunctions.com/code/8cdcb3c5fca4ae58963dcf43d7f9ff5902...

xSudo ★★★
()
Ответ на: комментарий от xSudo

Это не ошибка, в lastPage будет пустой массив

Это очевидная ошибка. Последняя страница должна содержать контент, а не быть пустой :)

а вот уже ниже он отсеивается.

Не вижу этого в коде:

$fullPages = (int)(count($data) / $itemsPerPage);
$lastPage = array_slice($data, $fullPages * $itemsPerPage);


В том то и дело, что не вполне логично, так как нужно вручную задавать количество страниц $page

Где? o_O

$page — это текущая выводимая страница. У человека задача стоит выводить все страницы, просто по последней у него возникли сложности: «Если их 45, то и выведутся три страницы по 15 строк. Но а что если 56?». Вот $page и показывает, какую страницу по счёту сейчас выводим.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

$page — это текущая выводимая страница

Теперь мне стали понятны недопонимание друг друга). Я немного по другому предполагал.

Не вижу этого в коде

Мои «планы» были, что в $lastPage выводится только записи с последней страницы)

xSudo ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.