Intereting Posts
Включение разрешений на запись Ubuntu Server в каталоге var / www / image Куки-файлы по субдоменам и хостам Предупреждение: mysqli_query () ожидает, что параметр 1 будет mysqli, строка, указанная в Понимание форм саморегуляции Netbeans Auto-Complete не работает для пользовательского PHP-класса Как сделать регистр сервера Linux неприемлемым? Глобальные переменные и локальные переменные Преобразование дня недели в даты для текущего месяца с MYSQL и PHP Неустранимая ошибка: вызов неопределенной функции session_register () как остановить данные, автоматически вставляемые в базу данных в php Laravel 5 / Lumen Request Header? Создание ISODate для MongoDB с помощью PHP Скрытие виджетов для определенных пользовательских ролей Невозможно изменить информацию заголовка – заголовки, уже отправленные … WordPress Issue Запрос на перекрестный запрос заблокирован: проблема при отправке заголовков в запрос Angular2 на laravel

XML-разбиение на страницы с помощью PHP

Ниже приведен код, который я использую для анализа XML-файла, однако в файле много записей, и я хочу его разбивать на страницы и отображать 20 записей на странице.

Я также хочу, чтобы ссылки на страницы находились внизу страницы, чтобы пользователи могли перейти на другие страницы. Это должно быть что-то вроде: если значение не указано, оно будет начинаться с 0 до 20, если значение 2 начинается с 40 и останавливается на 60, test.php?page=2 .

 $xml = new SimpleXMLElement('xmlfile.xml', 0, true); foreach ($xml->product as $key => $value) { echo "<a href=\"http://www.example.org/test/test1.php?sku={$value->sku}\">$value->name</a>"; echo "<br>"; } 

Что-то вроде этого должно работать:

 <?php $startPage = $_GET['page']; $perPage = 10; $currentRecord = 0; $xml = new SimpleXMLElement('xmlfile.xml', 0, true); foreach($xml->product as $key => $value) { $currentRecord += 1; if($currentRecord > ($startPage * $perPage) && $currentRecord < ($startPage * $perPage + $perPage)){ echo "<a href=\"http://www.example.org/test/test1.php?sku={$value->sku}\">$value->name</a>"; //echo $value->name; echo "<br>"; } } //and the pagination: for ($i = 1; $i <= ($currentRecord / $perPage); $i++) { echo("<a href='thispage.php?page=".$i."'>".$i."</a>"); } ?> 

Вы можете использовать функцию array_slice php (Документация: http://www.php.net/manual/en/function.array-slice.php )

Start будет $page * $itemsPerPage , end будет $page * $itemsPerPage + $itemsPerPage а количество страниц будет ceil(count($xml->product) / $itemsPerPage) .

Пример:

 $allItems = array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20); $itemsPerPage = 5; $page = isset($_GET['page']) ? intval($_GET['page']) : 0; foreach (array_slice($allItems, $page * $itemsPerPage, $page * $itemsPerPage + $itemsPerPage) as $item) { echo "item $item"; } 

Это даже работает 🙂 см .: http://codepad.org/JiOiWcD1

Поскольку SimpleXMLElement является Traversable , вы можете сделать разбивку на страницы с LimitItertor который поставляется с PHP.

Чтобы получить общее количество элементов продукта, вы можете использовать SimpleXMLElement::count() .

Пагинация работает, как описано в сотнях других вопросов, я предпочитаю использовать для LimitPagination тип LimitPagination .

Он принимает текущую страницу, общее количество элементов и элементов на странице в качестве аргументов (см. Также: PHP 5.2 и Pagination ). Он также имеет вспомогательную функцию для предоставления LimitIterator .

Пример:

 $products = $xml->product; // pagination $pagination = new LimitPagination($_GET['page'], $products->count(), 20); foreach ($pagination->getLimitIterator($products) as $product) { ... } 

Если вы хотите вывести пейджер, который позволяет перемещаться между страницами, LimitPagination предлагает больше предложить сделать это немного проще, например, только для всех страниц, выделяющих текущую страницу (здесь пример с помощью скобок):

 foreach ($pagination->getPageRange() as $page) { if ($page === $pagination->getPage()) { // current page printf("[p%d] ", $page); } else { printf("p%d ", $page); } } foreach ($pagination->getPageRange() as $page) { if ($page === $pagination->getPage()) { // current page printf("[p%d] ", $page); } else { printf("p%d ", $page); } } 

Интерактивная онлайн-демонстрация: http://codepad.viper-7.com/OjvNcO
Меньше интерактивной онлайн-демонстрации: http://eval.in/14176