php
  • xml
  • 2013-06-21 3 views 2 likes 
    2
    $files = glob('docs/*.xml'); 
    foreach($files as $file){ 
    $xml = new SimpleXMLElement($file, 0, true); 
    echo' 
    <tr> 
    <td>' . $xml->doctype . '</td> 
    <td><a href="viewdoc.php?docname=' . basename($file, '.xml') . '&username='. $xml->startedby .'&myname='. $_SESSION['username'] .'">' . basename($file, '.xml') . '</a></td> 
    <td><a href="viewprofile.php?name='. $xml->startedby .'">'. $xml->startedby .'</a></td> 
    <td>'. $xml->date .'</td> 
    <td>* * * * *</td> 
    <td></td> 
    </tr> 
    '; 
    } 
    

    Код, приведенный выше, представляет собой цикл, который показывает мне все файлы в папке документов. Я хочу иметь только 10 xml файлов на 1 странице и разбивать каждую страницу на 10 файлов. Как я могу это сделать?Сплит foreach к страницам

    +0

    Вы должны заглянуть в SPL: http://php.net/class.globiterator + http://php.net/class.limititerator - Это того стоит. Проблема уже решена.) Для разбивки на страницы, я думаю, что я оставил код на этом веб-сайте, переделывая * 'PageIterator' * или *' PagingIterator' *. Related: http://stackoverflow.com/a/15741465/367456 – hakre

    ответ

    3

    Вы можете разделить массив $ files одним из следующих способов, для обоих этих методов требуется установить переменную $ page, которая была бы целым числом, показывающим, какую 10 xml-страницу файла вы хотите просмотреть.

    // this will make files an array for 10 element 
    $files = glob('docs/*.xml'); 
    $files = array_chunk($files, 10); 
    foreach($files[$page-1] as $file){ 
    $xml = new SimpleXMLElement($file, 0, true); 
    echo' 
        <tr> 
        <td>' . $xml->doctype . '</td> 
        <td><a href="viewdoc.php?docname=' . basename($file, '.xml') . '&username='. $xml->startedby .'&myname='. $_SESSION['username'] .'">' . basename($file, '.xml') . '</a></td> 
        <td><a href="viewprofile.php?name='. $xml->startedby .'">'. $xml->startedby .'</a></td> 
        <td>'. $xml->date .'</td> 
        <td>* * * * *</td> 
        <td></td> 
        </tr> 
        '; 
    } 
    

    Или вы можете использовать срез массива, чтобы получить какой бы 10 вы хотели

    $files = glob('docs/*.xml'); 
    $files = array_slice($files, ($page-1)*10, 10); 
    foreach ($files as $file){ 
    $xml = new SimpleXMLElement($file, 0, true); 
    echo' 
        <tr> 
        <td>' . $xml->doctype . '</td> 
        <td><a href="viewdoc.php?docname=' . basename($file, '.xml') . '&username='. $xml->startedby .'&myname='. $_SESSION['username'] .'">' . basename($file, '.xml') . '</a></td> 
        <td><a href="viewprofile.php?name='. $xml->startedby .'">'. $xml->startedby .'</a></td> 
        <td>'. $xml->date .'</td> 
        <td>* * * * *</td> 
        <td></td> 
        </tr> 
        '; 
    } 
    
    +0

    Но как я могу создать страницу здесь? вы показываете мне только, как разделить .. – copypaste

    +0

    обновил код ... он был таким же, как ваш код для остальных ... – Orangepill

    +0

    Вам придется указать переменную $ page, которая показывает, какой 10-элементный патрон вы хотите ... $ page 1 = xml-файлы 1-10, $ page 10 = xml-файлы 91-100 – Orangepill

    1

    Вы должны сделать гораздо больше использовать итераторы в PHP, чтобы разделить работу даже:

    //Pages 
    $perPage = 10; // Avoid magic numbers 
    
    $files  = new GlobIterator('docs/*.xml'); 
    $filtered = new FileXmlDoctypeFilterIterator($files, $requestedType); 
    $count  = iterator_count($filtered); 
    $pagination = new LimitPagination($_GET['page'], $count, $perPage); 
    
    foreach ($pagination->getLimitIterator($filtered) as $file) 
    { 
        $xml = simplexml_load_file($file); 
        ... 
    } 
    

    Так как это работает? Прежде всего, используя предопределенный GlobIterator, который по его имени вы уже можете увидеть, что он делает. Но вместо того, чтобы возвращать массив как glob(), это итератор.

    Это сделано специально для того, чтобы обеспечить укладку с другими итераторами. Например, со следующей, которая является конкретным FilterIterator, поэтому вам нужно переместить код, который у вас есть для решения фильтра, в этот итератор. Это описано в руководстве по PHP, как это работает.

    Затем количество всех фильтрованных файлов получается с помощью функции iterator_count(), которая затем используется с объектом LimitPagination, который полностью инкапсулирует разбиение на страницы на собственный объект. См. Мой answer to XML pagination with PHP для получения дополнительной информации.

    Он предлагает еще один итератор через $pagination->getLimitIterator($filtered), чтобы он предлагал те отфильтрованные файлы, которые находятся на указанной странице ($_GET['page'] в приведенном выше примере). Он также предлагает список страниц, чтобы вы могли выводить ссылки на другие страницы.

    Так что было сделано здесь:

    1. Ваша проблема фильтрации файлов была инкапсулированные в фильтр-итератора.
    2. Ваша проблема с разбиением на страницы была инкапсулирована в объект pagination, который также предоставляет итератор.
    3. Ваша проблема с фильтрацией файлов globbed была решена путем превращения массива в итератор.

    Технически вы можете решить все эти проблемы с помощью массивов, однако большая польза от итераторов заключается в том, что они гораздо более гибкие, чем массивы.

    Вы можете, например, дальнейшее совершенствование пути создания итератора, который будет создавать специальный ребенок SimpleXMLElement который также несет в себе алгоритм, чтобы получить тип документа и каких knowns о файле тропе. Предоставление этого отдельного интерфейса поможет с фильтром-итератором.

    Также при использовании разбиения на страницы может быть целесообразным кэшировать фильтр-итератор, чтобы операция подсчета не слишком сильно нагружалась.

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

    Если вы хотите использовать массивы, вам необходимо превратить его в объект ArrayPagination, и вместо фильтра-итератора вы можете использовать array_filter() с функцией обратного вызова, которая фильтрует ваши файлы. И если вы используете массивы для прототипирования, есть также ArrayIterator, поэтому вы можете переключиться с массивов на итератор между ними (и есть CallbackFilterIterator, что также должно позволить вам повторно использовать функцию фильтра массива).

    Смежные вопросы