www.webdeveloper.com
Results 1 to 3 of 3

Thread: Grouping events using SimpleXML/PHP

  1. #1
    Join Date
    Aug 2004
    Posts
    26

    Grouping events using SimpleXML/PHP

    Hi,

    I have events that I'm pulling in from an XML file using SimpleXML.

    Some events have the same name but they have different links. What I would like to do is group events that have the same name - in other words all the links appear on the outputted HTML file under one event name rather than 2.

    Below is my XML file and the SimpleXML/PHP code.

    Code:
    <matches>
    
    <match>
    <sportname>Polo</sportname>
    <tournamentname/>
    <thetime>16:30</thetime>
    <matchname>Team Red v Team Yellow</matchname>
    <linkset>
    <link lang="de">page1.html</link>
    <link lang="">page2.html</link>
    </linkset>
    </match>
    
    <match>
    <sportname>Polo</sportname>
    <tournamentname/>
    <thetime>4.30pm</thetime>
    <matchname>Team Red v Team Yellow</matchname>
    <linkset>
    <link lang="de">page3.html</link>
    <link lang="">page4.html</link>
    </linkset>
    </match>
    
    </matches>

    PHP Code:
    <?php
        $mymatches 
    simplexml_load_file('test3.xml');
        
        
        foreach (
    $mymatches as $matchlist) {
            
    $match=$matchlist->matchname;
            
    $sport=$matchlist->sportname;
            
    $tournament=$matchlist->tournamentname;
            
    $time=$matchlist->thetime;

            echo 
    "<div class=\"section section".strtolower($sport)." ".strtolower($tournament)."\">";
            echo 
    "<h3>".$time." ";
            if (
    $tournament != "" ) { echo $tournament.": "; }
            echo 
    $match."</h3>\n";
            echo 
    "<div class=\"matchlinks\">\n";
            
            
            
              foreach (
    $matchlist->linkset->link as $linklist) {
          
            echo 
    "<div class=\"matchrow\"><div class=\"channelname\">".$linklist['channelname']."</div><div class=\"language\">".$linklist['lang']."</div><div class=\"link\"><a href=\"".$linklist."\" target=\"_blank\">Visit page</a></div><div class=\"clearb\"></div></div>\n";
                    
            
      }
            echo 
    "</div></div>\n";    
        
      }
    ?>
    I would ideally like to output:
    Team Red v Team Yellow
    - page1.html
    - page2.html
    - page3.html
    - page2.html
    (rather than 2 separate events of the same name which it currently gives me)

    Any ideas?
    Last edited by denhamd2; 07-20-2013 at 10:25 AM.

  2. #2
    Join Date
    Mar 2011
    Posts
    1,159
    You could loop through your events list one by one. First, create an array to keep track of used $matchnames as you work through the list. The first step of each loop should be to check if the current $matchname has been stored in that array of used names. If not, store this $matchname in your used names array. Then output the information for the current $matchname. Then start a second loop to scan the rest of the list for any other matches with the same $matchname, and if you find one output that match's information as well. If the current $matchname is already in your list of used names, you can just skip it. Continue until done.

  3. #3
    Join Date
    Aug 2004
    Posts
    26
    Thanks very much for the reply.

    I've taken a stab below but am pulling my hair out as its not working. I'm a bit of a newbie so please excuse my stupidity. Would you be able to take a look and point me in the right direction please?

    PHP Code:
    <?php
        $mymatches 
    simplexml_load_file('test3.xml');
        
          
    $arr = array(); // create new array where we'll store the match names

        
    foreach ($mymatches as $matchlist) {
            
    $match=$matchlist->matchname;
            
    $sport=$matchlist->sportname;
            
    $tournament=$matchlist->tournamentname;
            
    $time=$matchlist->thetime;
            
                  
    $arr[$matchunique] = $match// Add the match to the array
                  

    if (in_array($match,$arr)) // check if match is already in array
      
    {


            
            
              foreach (
    $matchlist->linkset->link as $linklist) {
          
            echo 
    "<div class=\"matchrow\"><div class=\"channelname\">".$linklist['channelname']."</div><div class=\"language\">".$linklist['lang']."</div><div class=\"link\"><a href=\"".$linklist."\" target=\"_blank\">Visit page</a></div><div class=\"clearb\"></div></div>\n";
                    
            
                  }
                  
                  
      }
      
      else 
    // do this if the match is not already in the array
      
    {
       echo 
    "<div class=\"section section".strtolower($sport)." ".strtolower($tournament)."\">";
            echo 
    "<h3>".$time." ";
            if (
    $tournament != "" ) { echo $tournament.": "; }
            echo 
    $match."</h3>\n";
            echo 
    "<div class=\"matchlinks\">\n";
            
            
            
              foreach (
    $matchlist->linkset->link as $linklist) {
          
            echo 
    "<div class=\"matchrow\"><div class=\"channelname\">".$linklist['channelname']."</div><div class=\"language\">".$linklist['lang']."</div><div class=\"link\"><a href=\"".$linklist."\" target=\"_blank\">Visit page</a></div><div class=\"clearb\"></div></div>\n";  }
                  
            echo 
    "</div></div>\n";    
        
      }
        }
    ?>

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center



Recent Articles