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 ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.