For For循环中按日期排序XML

时间:2018-05-12 16:31:53

标签: php arrays xml sorting

我需要帮助指出正确的方向。我整个上午都对这个话题进行了问答,而且我发现的所有问题都与我的代码相似。

我有一个如下所示的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>';
               }

我似乎无法弄清楚如何对此进行排序。

我已经查看了以下答案:

PHP Sort XML Elements by Date

Sorting XML File into ascending order using php

How to sort SimpleXMLElement on 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 :(得分:0)

我终于明白了。发布我的解决方案以帮助他人。

在我提出的问题中,我想出了第一个链接的答案:

$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);
});