Сортировка XML по дате в цикле - PullRequest
0 голосов
/ 12 мая 2018

Мне нужна помощь, чтобы указывать в правильном направлении.Я все утро просматривал вопросы и ответы по этой теме, и ни один из них, которые я нашел, не похож на мой код для работы.

У меня есть XML-файл, который выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<images>
 <image>
  <src>belly_button_1.jpg</src>
  <title>Belly Button</title>
  <desc>Belly button piercing using 14G curved barbell.</desc>
  <instagram>https://www.example.com/p/BbHba1BgmrC/</instagram>
  <date>November 5, 2017</date>
 </image>
 <image>
  <src>christina_1.jpg</src>
  <title>Christina(Pubic)</title>
  <desc>Christina(pubic) piercing using 14G curved barbell.</desc>
  <instagram>https://www.example.com/p/BclajtRgkPk/</instagram>
  <date>December 11, 2017</date>
 </image>
 <image>
  <src>christina_2.jpg</src>
  <title>Christina(Pubic)</title>
  <desc>Christina(pubic) piercing using 14G curved barbell.</desc>
  <instagram>https://www.example.com/p/BdSlWkogshq/</instagram>
  <date>December 29, 2017</date>
 </image>
 <image>
  <src>eyebrow_1.jpg</src>
  <title>Eyebrow</title>
  <desc>Vertical eyebrow piercing using 16G curved barbell.</desc>
  <instagram>https://www.example.com/p/BbIBtHDAX2F/</instagram>
  <date>November 5, 2017</date>
 </image>
 <image>
  <src>eyebrow_2.jpg</src>
  <title>Eyebrow</title>
  <desc>Vertical eyebrow piercing using 16G curved barbell.</desc>
  <instagram>https://www.example.com/p/Bfi9x_RAczq/</instagram>
  <date>February 23, 2018</date>
 </image>
 <image>
  <src>lobe_1.jpg</src>
  <title>Ear Lobe</title>
  <desc>Ear lobe piercing using 16G straight barbell.</desc>
  <instagram>https://www.example.com/p/BbHxZLtAnVA/</instagram>
  <date>November 5, 2017</date>
 </image>
 <image>
  <src>lobes_1.jpg</src>
  <title>Ear Lobe(Pair)</title>
  <desc>Ear lobe piercings using 14G captive bead rings.</desc>
  <instagram>https://www.example.com/p/Bb4zQO1gsAO/</instagram>
  <date>November 24, 2017</date>
 </image>
 <image>
  <src>lobes_2.jpg</src>
  <title>Ear Lobe(Pair)</title>
  <desc>Ear lobe piercings using 14G captive bead rings.</desc>
  <instagram>https://www.example.com/p/BdSlqmXggSt/</instagram>
  <date>December 29, 2017</date>
 </image>
 <image>
  <src>monroe_1.jpg</src>
  <title>Monroe</title>
  <desc>Monroe piercing using 16G lip stud.</desc>
  <instagram>https://www.example.com/p/BbHxJwYA3lt/</instagram>
  <date>November 5, 2017</date>
 </image>
 <image>
  <src>monroe_2.jpg</src>
  <title>Monroe</title>
  <desc>Monroe piercing using 16G internally threaded lip stud.</desc>
  <instagram>https://www.example.com/p/BifXeMYFjfO/</instagram>
  <date>May 7, 2018</date>
 </image>
 <image>
  <src>nipples_1.jpg</src>
  <title>Nipples(Female Pair)</title>
  <desc>Nipple piercings using 14G straight barbell.</desc>
  <instagram>https://www.example.com/p/Bcl7eSoAuaa/</instagram>
  <date>December 12, 2017</date>
 </image>
 <image>
  <src>nipples_2.jpg</src>
  <title>Nipples(Female Pair)</title>
  <desc>Nipple piercings using 14G straight barbell.</desc>
  <instagram>https://www.example.com/p/BdSlP5iATaj/</instagram>
  <date>December 29, 2017</date>
 </image>
 <image>
  <src>nostril_1.jpg</src>
  <title>Nostril</title>
  <desc>Nostril piercing using 20G nose stud.</desc>
  <instagram>https://www.example.com/p/BbHbK6gg8Ub/</instagram>
  <date>November 5, 2017</date>
 </image>
 <image>
  <src>nostril_2.jpg</src>
  <title>Nostril</title>
  <desc>Nostril piercing using 18G nose stud.</desc>
  <instagram>https://www.example.com/p/BifWlv7FsMK/</instagram>
  <date>May 7, 2018</date>
 </image>
 <image>
  <src>septum_1.jpg</src>
  <title>Septum</title>
  <desc>Septum piercing using 16G horeshoe barbell.</desc>
  <instagram>https://www.example.com/p/Bb_QglhAYIA/</instagram>
  <date>November 27, 2018</date>
 </image>
 <image>
  <src>septum_2.jpg</src>
  <title>Septum</title>
  <desc>Septum piercing using 16G horeshoe barbell.</desc>
  <instagram>https://www.example.com/p/BcDzH46AG6W/</instagram>
  <date>November 28, 2018</date>
 </image>
 <image>
  <src>septum_snakebites_1.jpg</src>
  <title>Septum And Snakebites</title>
  <desc>Septum piercing using 16G horeshoe barbell along with snakebite piercings using 16G internally threaded lip studs.</desc>
  <instagram>https://www.example.com/p/BcI_PAuAYQ3/</instagram>
  <date>November 30, 2017</date>
 </image>
 <image>
  <src>snakebites_1.jpg</src>
  <title>Snakebites</title>
  <desc>Snakebite piercings using 14G horseshoe barbells.</desc>
  <instagram>https://www.example.com/p/BbK2X5pgXpv/</instagram>
  <date>November 6, 2017</date>
 </image>
 <image>
  <src>snakeeyes_1.jpg</src>
  <title>Snake Eyes</title>
  <desc>Snake Eyes piercing through tip of tongue using 14G internally threaded curved barbell.</desc>
  <instagram>https://www.example.com/p/BePKMu_AdHH/</instagram>
  <date>January 21, 2018</date>
 </image>
 <image>
  <src>throat_surface.jpg</src>
  <title>Throat Surface</title>
  <desc>Throst surface piercing using two 16G curved barbells.</desc>
  <instagram>https://www.example.com/p/BbHwp83Adq3/</instagram>
  <date>November 5, 2017</date>
 </image>
 <image>
  <src>tongue_1.jpg</src>
  <title>Tongue</title>
  <desc>Tongue piercing using 14G straight barbell.</desc>
  <instagram>https://www.example.com/p/BbH21jKAovA/</instagram>
  <date>November 5, 2017</date>
 </image>
 <image>
  <src>tongue_2.jpg</src>
  <title>Tongue</title>
  <desc>Tongue piercing using 14G straight barbell.</desc>
  <instagram>https://www.example.com/p/Bb76eLBAVSf/</instagram>
  <date>November 25, 2017</date>
 </image>
 <image>
  <src>tongue_3.jpg</src>
  <title>Tongue</title>
  <desc>Tongue piercing using 14G straight barbell.</desc>
  <instagram>https://www.example.com/p/BeUhHj2goVO/</instagram>
  <date>January 23, 2018</date>
 </image>
</images>

И я использую цикл for для отображения этих данных на своей странице следующим образом:

if(isset($_GET['page'])) { $startPage = $_GET['page']; } else { $startPage = 1; }
$perPage = 9;
$currentRecord = 1;
$imagexml = new SimpleXMLElement($_SERVER['DOCUMENT_ROOT'].'/info/gallery.xml', 0, true);

// Pagination
$numberPages = ceil((count($imagexml->image) / $perPage));
$prevDisabled = $startPage > 1 ? '' : 'disabled';
echo "<li class='page-item {$prevDisabled}'><a class='page-link' href='?page=".($startPage-1)."' class='button'>Previous</a></li>";
for ($i = 1; $i <= $numberPages; $i ++) {
    $active = $i == $startPage ? 'active' : '';
    echo ("<li class='page-item {$active}'><a class='page-link'  href='?page=" . $i . "'>" . $i . "</a></li>");
} 
$nextDisabled = $startPage < $numberPages ? '' : 'disabled';
echo "<li class='page-item {$nextDisabled}'><a class='page-link' href='?page=".($startPage+1)."' class='button'>Next</a></li>";

  for ($currentRecord = (($startPage-1)*$perPage); $currentRecord < (($startPage-1)*$perPage)+$perPage && $currentRecord < count($imagexml->image); $currentRecord++) {
            $image = $imagexml->image[$currentRecord];
                  echo '<div class="col-sm-12 col-md-4 mb-3 text-center">
                        <div class="card">
                      <a href="http://example.com/img/gallery/'.$image->src.'" data-toggle="lightbox" data-gallery="body_piercings">
                      <img src="http://example.com/img/gallery/'.$image->src.'" class="card-img-top img-fluid img-thumbnail bx-shadow" alt="Card image cap">
                      </a>
                      <div class="card-body">
                       <h5 class="card-title txt-shadow">'. $image->title .'</h5>
                       <p class="card-text txt-shadow">'.$image->desc.'</p>
                       <a href="'.$image->instagram.'" target="_blank" class="btn btn-instagram bx-shadow"><i class="fa fa-instagram"> </i> View On Instagram</a>
                      </div>
                      <div class="card-footer">
                     <small class="text-muted">Posted: '.$image->date.'</small>
                   </div>
                       </div>
                      </div>';
               }

Кажется, я не могу понять, как это отсортировать.

Я уже посмотрел следующие ответы:

Сортировка элементов XML по дате

Сортировка файла XML в порядке возрастания с помощью php

Как отсортировать SimpleXMLElement на PHP

Все они используют цикл foreach для вывода данных, но так как я использую нумерацию страниц, я использую for цикл, и мне нужно некоторое руководство.

Одна из причин, по которой у меня возникли проблемы, заключается в том, что при ответе на второй связанный вопрос ответ использует:

$books = array();

$xml = simplexml_load_file('books.xml'); 

foreach($xml->items->item as $item) {
    $books[] = array(
                     'id'             => (string)$item->attributes()->id,
                     'title'          => (string)$item->title,
                     'isbn'           => (string)$item->isbn,
                     'course'         => (string)$item->courses->course[0],
                     'borrowed_count' => intval($item->borrowedcount)
                    );
}


array_sort_by_column($books, 'borrowed_count');

var_dump($books);

Соответствующий код, который у меня есть:

for (
    $currentRecord = (($startPage - 1) * $perPage);
    $currentRecord < (
        ($startPage - 1) * $perPage) + $perPage && $currentRecord < count($imagexml->image
    );
    $currentRecord++
) {

Итакпревращение в что-то вроде foreach($imagexml->images->image as $image) { не представляется возможным без потери моей нумерации страниц.Если я верю, что смогу получить помощь в этой области, я, вероятно, смогу выяснить остальное.

Я забыл добавить, что хочу отсортировать по дате публикации.Сначала новые.

1 Ответ

0 голосов
/ 12 мая 2018

Я наконец понял это. Опубликовать мое решение, чтобы помочь другим.

Исходя из первого связанного ответа на мой вопрос, я придумал:

$arr=array();
foreach($imagexml->image as $aImage)
{
    $arr[]=$aImage;
}
//print_r($arr);
/* uncomment the above line to debug */
usort($arr,function($a,$b){
    return strtotime($a->date)-strtotime($b->date);
});
//print_r($arr);
/* uncomment the above line to debug */
$imagexml=simplexml_load_string(<<<XML
<?xml version="1.0"?>
<images>
</images>
XML
);
foreach($arr as $aImage)
{
    $tImage=$imagexml->addChild($aImage->getName());
    $tImage->addChild($aImage->src->getName(),(string)$aImage->src);
    $tImage->addChild($aImage->title->getName(),(string)$aImage->title);
    $tImage->addChild($aImage->desc->getName(),(string)$aImage->desc);
    $tImage->addChild($aImage->instagram->getName(),(string)$aImage->instagram);
    $tImage->addChild($aImage->date->getName(),(string)$aImage->date);
}

И для отображения новейших изображений сначала:

usort($arr,function($a,$b){
    return strtotime($b->date)-strtotime($a->date);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...