login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[PHP / XML] Array sort() probeem

Offline Explosive - 22/07/2006 00:09
Avatar van ExplosiveLid Beste mede webmaster,

Ik ben vandaag de hele dag aan het werk geweest met een agenda systeempje dat met XML werkt, alles 60x veranderd natuurlijk .

nu heb ik echter nog wel een probleem. Eind van de dag kwam ik er achter dat wanneer de feesten niet op datum worden toegevoegd, deze ook niet in volgorde in de agenda verschijnen. Iets waar ik wel op had gehoopt.

Omdat de agenda word uitgelezen via een XML parser, welke er een array van maakt, probeerde ik het met de functie sort(), dit had echter geen resultaat.

Ik zal om het probeem duidelijk te maken nu even me code posten.

eerst me XML file:
  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <AGENDA>
  3. <AGENDAPUNT id="1">
  4. <DATE>1144965600</DATE>
  5. <STARTTIME>23:00</STARTTIME>
  6. <ENDTIME>05:00</ENDTIME>
  7. <PARTYNAME>Underground Shock meets SQ-E</PARTYNAME>
  8. <PRESALE>7,50</PRESALE>
  9. <DOORSALE>12,50</DOORSALE>
  10. <LOCATION>Incasa - Leiden</LOCATION>
  11. <AGE>18+</AGE>
  12. </AGENDAPUNT>
  13. <AGENDAPUNT id="2">
  14. <DATE>1154037600</DATE>
  15. <STARTTIME>23:00</STARTTIME>
  16. <ENDTIME>05:00</ENDTIME>
  17. <PARTYNAME>Underground Shock - Sexy summer edition</PARTYNAME>
  18. <PRESALE>FREE</PRESALE>
  19. <DOORSALE>FREE</DOORSALE>
  20. <LOCATION>Ladies First - Alphen aan den Rijn</LOCATION>
  21. <AGE>16+</AGE>
  22. </AGENDAPUNT>
  23. <AGENDAPUNT id="3">
  24. <DATE>1161295200</DATE>
  25. <STARTTIME>23:00</STARTTIME>
  26. <ENDTIME>05:00</ENDTIME>
  27. <PARTYNAME>Underground Shock - Hardcore will never die</PARTYNAME>
  28. <PRESALE>FREE</PRESALE>
  29. <DOORSALE>FREE</DOORSALE>
  30. <LOCATION>Incasa - Leiden</LOCATION>
  31. <AGE>18+</AGE>
  32. </AGENDAPUNT>
  33. <AGENDAPUNT id="4">
  34. <DATE>1164063600</DATE>
  35. <STARTTIME>23:00</STARTTIME>
  36. <ENDTIME>05:00</ENDTIME>
  37. <PARTYNAME>Test - Webedition</PARTYNAME>
  38. <PRESALE>7,-</PRESALE>
  39. <DOORSALE>10,88</DOORSALE>
  40. <LOCATION>UB</LOCATION>
  41. <AGE>12-</AGE>
  42. </AGENDAPUNT>
  43. <AGENDAPUNT id="5">
  44. <DATE>1153519200</DATE>
  45. <STARTTIME>23:00</STARTTIME>
  46. <ENDTIME>05:00</ENDTIME>
  47. <PARTYNAME>Test - Webedition</PARTYNAME>
  48. <PRESALE>7,-</PRESALE>
  49. <DOORSALE>10,88</DOORSALE>
  50. <LOCATION>UB</LOCATION>
  51. <AGE>12-</AGE>
  52. </AGENDAPUNT>
  53. </AGENDA>


nu dan me xml parser:
  1. <?php
  2. // $file van de pagina zelf!
  3.  
  4. #$xml_file = "../xml/top10.xml";
  5. $xml_parser = xml_parser_create();
  6.  
  7. if (!($fp = fopen($xml_file, "r"))) {
  8. die("could not open XML input");
  9. }
  10.  
  11. $data = fread($fp, filesize($xml_file));
  12. fclose($fp);
  13. xml_parse_into_struct($xml_parser, $data, $vals, $index);
  14. xml_parser_free($xml_parser);
  15.  
  16. $params = array();
  17. $level = array();
  18. foreach ($vals as $xml_elem) {
  19. if ($xml_elem['type'] == 'open') {
  20. if (array_key_exists('attributes',$xml_elem)) {
  21. list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
  22. } else {
  23. $level[$xml_elem['level']] = $xml_elem['tag'];
  24. }
  25. }
  26. if ($xml_elem['type'] == 'complete') {
  27. $start_level = 1;
  28. $php_stmt = '$params';
  29. while($start_level < $xml_elem['level']) {
  30. $php_stmt .= '[$level['.$start_level.']]';
  31. $start_level++;
  32. }
  33. $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
  34. eval($php_stmt);
  35. }
  36. }
  37.  
  38. // om de array af te drukken gebuik:
  39. /*echo "<pre>";
  40. print_r($params);
  41. echo "</pre>;*/
  42. ?>


Wanneer je bijde bestanden tot mekaar voegd, komt er een mooie uitput op je systeem Dat werkt dus allemaal.

Nu het probeem bestand:
  1. <?php
  2. // wat is de xml file?
  3. $xml_file = 'xml/agenda.xml';
  4. // include parser
  5. include('main_php/xml_parser.php');
  6.  
  7. // tel hoeveel agenda punten er zijn
  8. $count = count($params['AGENDA']);
  9.  
  10. // timestamp voor datum vergelijking
  11. $nu = time();
  12. $datum = date("d-m-Y");
  13.  
  14. // Bericht
  15. echo "<p>Hier vind u een overzicht van feesten waar DJ Clone of DJ Doubleganger zal draaien. <br>
  16. Ook Underground Shock feesten staan op deze website.<br />";
  17.  
  18. // Nieuwe feesten
  19. echo "<h1>Feesten in de toekomst</h1>";
  20. // loop door de agendapunten heen
  21. for($i=0;$i<=$count;$i++){
  22. // geef alleen datum is de toekomst weer!
  23. if($params['AGENDA'][$i]['DATE'] >= $datum){
  24. // oke datum in de toekomst
  25. echo $params['AGENDA'][$i]['DATE']."&nbsp;-&nbsp;".$params['AGENDA'][$i]['PARTYNAME']."<br />";
  26. }
  27. }
  28.  
  29. // oude feesten
  30. echo "<h1>Feesten in het verleden</h1>";
  31. for($i=1;$i<=$count;$i++){
  32. // geef alleen datum is de toekomst weer!
  33. if($params['AGENDA'][$i]['DATE'] < $datum){
  34. // oke datum in de toekomst
  35. echo $params['AGENDA'][$i]['DATE']."&nbsp;-&nbsp;".$params['AGENDA'][$i]['PARTYNAME']."<br />";
  36. }
  37. }
  38. ?>


Het is dus de bedoeling dat de feeste met de datum in de toekomst bij 'feesten in de toekomst' komen en bij 'feesten in het verleden' de oude feesten. echter wel gesorteerd op datum.

iemand ideeen hoe ik dit aan moet pakken??
Heel erg bedankt voor de hulp:!:

4 antwoorden

Gesponsorde links
Offline Maarten - 22/07/2006 00:53
Avatar van Maarten Erelid Je leest die XML feed uit in een aparte array, met volgende structuur:
$feest[timestamp_hier] = array($start, $eind, $naam, $vvk, $add, $locatie, $age);

Vervolgens kan je de keys gewoon sorteren, probleem opgelost 
Offline Explosive - 22/07/2006 12:17 (laatste wijziging 23/07/2006 21:24)
Avatar van Explosive Lid Dat uitlezen als een aparte array, moet ik dat al in de parser doen? of kan dat gewoon in de agenda zelf?

Edit: ik kom er nog steeds niet uit , Kun je me messchien een klein voorbeeldje geven?? Heel erg bedankt
Offline Maarten - 23/07/2006 21:43
Avatar van Maarten Erelid Toon eerst wat je al geprobeerd hebt...
Offline Explosive - 23/07/2006 22:27 (laatste wijziging 24/07/2006 15:14)
Avatar van Explosive Lid oke, via een vriend kwam ik acher array_multisort()

nu heb ik het volgende agenda bestand:
  1. <?php
  2. // wat is de xml file?
  3. $xml_file = 'xml/agenda.xml';
  4. // include parser
  5. include('main_php/xml_parser.php');
  6.  
  7. echo "<pre>";
  8. print_r($params);
  9. echo "</pre>";
  10.  
  11. // maak van de array nog maar 2 lagen
  12. $output = $params['AGENDA'];
  13. // dit output de timestamp echo $output[1]['DATE'];
  14.  
  15. // tel hoeveel agenda punten er zijn
  16. $count = count($params['AGENDA']);
  17.  
  18. // timestamp voor datum vergelijking
  19. $nu = time();
  20. $datum = date("d-m-Y", $nu);
  21.  
  22. // Bericht
  23. echo "<p>Hier vind u een overzicht van feesten waar DJ Clone of DJ Doubleganger zal draaien. <br>
  24. Ook Underground Shock feesten staan op deze website.<br />";
  25.  
  26. // feesten loop test loop 1
  27. for($i=0;$i<=$count;$i++){
  28. echo $output[$i]['DATE']."<br />";
  29. }
  30.  
  31. echo "<br />";
  32.  
  33. // feesten loop test 2
  34. for($i=0;$i<=$count;$i++){
  35. //echo $output[$i]."<br />";
  36. //echo $output[$i]['DATE']."<br />";
  37. $array = array_multisort($output[$i]['DATE'],SORT_ASC,SORT_REGULAR);
  38. print_r($array);
  39. }
  40.  
  41. ?>
Echter werkt het nu nog niet. Ik heb geen idee wat ik fout doe, als je de code nu uitvoerd doet die de hele 2de loop niet , maar een error zie ik niet op me scherm terwijl het error_reporting op E_ALL staat
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.224s