Расширенный SimpleXml / PHP - PullRequest
       7

Расширенный SimpleXml / PHP

1 голос
/ 22 апреля 2011

В настоящее время я анализирую ленту событий xml, созданную онлайн-сервисом, на веб-сайте моей группы.Он включает в себя все данные, которые мне нужны для отображения на моем веб-сайте, включая дату, время, имя и т. Д. И т. Д. И т. Д.

Однако я хотел бы найти способ упорядочить даты по месяцам, чтобы они отображалиськак это:

АПРЕЛЬ 2011

  • дата 1
  • дата 2
  • дата 3

май 2011

  • дата 4
  • дата 5

июнь 2011

  • дата 6
  • дата 7

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

В настоящее время мой (тупой) код выглядит следующим образом:

$shows = new SimpleXMLElement('URL TO XML FILE', null, true); 

foreach($shows as $show) // loop through our books
{
    // Getting Variable from XML and changing them into provence/state codes (reduce space)
    if(($show->state) != "" AND ($show->country) == "Canada")
    {

    if( 
        // CANADIAN PROVENCES

        // THIS FINDS CANADIAN PROVENCES AND HAS BEEN REMOVED

    } elseif (($show->state) != "" AND ($show->country) == "United States") {
    if( 
        // AMERICAN STATES
        // THIS FINDS AMERICAN STATES AND HAS BEEN REMOVED


    // IF NONE OF THESE ARE HAPPENING JUST SHOW THE STATE
    } else { $display_state = "{$show->state}"; };

    /////////////
    // SETTING HOW WE WANT THE DATE
    $format = "M jS, Y"; //or something else that date() accepts as a format
    $display_date = date_format(date_create(($show->date)), $format);


    /////////////
    // CHECKING TO SEE IF ITS A FESTIVAL
    if(($show->showType) == "Festival / Fair") {
    // Setting the variable if its a festival or fair
    $smart_venue_fest_or_building = "{$show->name}";
    } else {
    // If it's not a festival or fair show the club
    $smart_venue_fest_or_building = "{$show->venueName}";
    };



    //
    // RUNNING THE LOOP
    //

    echo "<li><p>"; // OPEN THE LIST ITEM

    echo "$display_date - {$show->city} $display_state - $smart_venue_fest_or_building";

    if(($show->venueURI) != "" OR ($show->ticketURI) != "") {
    echo "<br />\n<span class='ticketLinks'>"; // PUTTING IN THE SURROUNDING SPAN TAG IF THE TICKET AND INFO LINK EXIST
    }

    if(($show->venueURI) != "") { // VENUE LINK
    echo "<a href='{$show->venueURI}' target='_blank' title='Venue information for {$show->venueName}'><small>GET INFO</small></a>";
    };

    if(($show->venueURI) != "" AND ($show->ticketURI) != "") {
    echo " - "; // SEPPERATING THE TICKET AND VENUE LINK IF THEY BOTH EXIST
    }

    if(($show->ticketURI) != "") { // TICKET LINK
    echo "<a href='{$show->ticketURI}' target='_blank' title='Buy tickets for {$show->venueName} on $display_date'><small>BUY TICKETS</small></a>";
    };

    if(!empty($show->ticketURI) OR !empty($show->venueURI)) {
    echo "</span>"; // CLOSING THE HOLDER TAG
    }

    echo "</p></li>\n\n"; // CLOSE THE LIST ITEM
}

Может кто-нибудь дать мнелюбое руководство, или укажите мне, как мне поступить.

1 Ответ

4 голосов
/ 22 апреля 2011

Один из способов сделать это - сначала выполнить итерацию по набору данных и сгруппировать каждый элемент по месяцам. Как то так.

$monthShows = array();

foreach($shows as $show) // loop through our books
{
  $monthShows[date('F', $show->date)][] = $show;
}

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

Тогда это просто, как

foreach ($monthShows as $month => $shows) {
  echo "<h2>{$month}</h2>";

  // Your output code
}
...