PHP HIlfe gesucht ...

Hallo und guten Abend :wink:

Ich habe mal wieder ein kleines php Problem, allerdings privater Natur.
Für unseren Handballverein bastle ich ein wenig an unserer Homepage herum und versuche nun die Spielpläne darzustellen, bzw. nur die Heimspiele.

Was ich bereits habe, ist ein Script das vom „Provider“ die Pläne der einzlenen Mannschaften auslesen kann, als XML File auf dem Webserver abspeichert und daraus dann per php die Spielpaarungen darstellt.

Allerdings kann ich nur die Spiele der einzelnen Manschaften abfragen, aber nicht die des ganzen Vereins. Da geht nur eine Abfrage auf die nächsten 30 Spiele.
Das wäre zwar auch ne Lösung, aber wenn ich dann noch auf Heimspiele filtere, wirds auch wieder weniger … und dadurch das die Jugendmannschaften im E und F Jugendbereich nur Miniturniere spielen, belegen die dann die übriggebliebenen darzustellenden Plätze… so wird das also nix mit einer Darsellung für die nächsten Heimspiele.

Eine Alternative wäre ein Export in eine Exceldatei und diese dann per php auslesen … dann müßte ich allerdings die Datei regelmäßig aktualisieren (falls Änderungen erfogen) …

Optimal wäre das Auslesen aus den XML Dateien und eine Art Zusammenführung in eine einzige Datei … wie kann ich das mit SimpleXML realisieren?

So sieht die Struktur aus … ich denke man müßte versuchen jeweils alle Einträge unter <Spiel> auszulesen und wieder in die neue Datei einfügen …

- <NaechsteSpiele>
- <Spiel>
  <Liga>001508501501514506000000000000000004002</Liga> 
  <Aktualisierungsdatum>2007-07-10T06:06:31.0000000+02:00</Aktualisierungsdatum> 
  <SpielDatum>2007-09-09T00:00:00.0000000+02:00</SpielDatum> 
  <Mannschaft1>001508501501514506000000000000000004003</Mannschaft1> 
  <Mannschaft2>001508501501514506000000000000000004004</Mannschaft2> 
  <Tore01>0</Tore01> 
  <Tore02>0</Tore02> 
  <Tore1>0</Tore1> 
  <Tore2>0</Tore2> 
  <Punkte1>0</Punkte1> 
  <Punkte2>0</Punkte2> 
  <Halle>1220401166</Halle> 
  <Schiri>1220401028</Schiri> 
  <Anmerkung /> 
  <SpielBericht /> 
  <SpielVon>2007-09-09T11:15:00.0000000+02:00</SpielVon> 
  <SpielBis>2007-09-09T12:44:00.0000000+02:00</SpielBis> 
  <Zuschauer>0</Zuschauer> 
  <Heim>HSG Mittelweser F1</Heim> 
  <Gast>HSG Mittelweser F2</Gast> 
  <HallenName>Sulingen - Sporthalle Schulzentrum</HallenName> 
  <HallenStrasse>Edenstraße</HallenStrasse> 
  <HallenOrt>27232 Sulingen</HallenOrt> 
  <LigaName>09.09.07 Sulingen 1</LigaName> 
  </Spiel>
- <Spiel>
  <Liga>001508501501514506000000000000000004003</Liga> 
  <Aktualisierungsdatum>2007-07-10T06:06:31.0000000+02:00</Aktualisierungsdatum> 
  <SpielDatum>2007-09-09T00:00:00.0000000+02:00</SpielDatum> 
  <Mannschaft1>001508501501514506000000000000000004002</Mannschaft1> 
  <Mannschaft2>001508501501514506000000000000000004003</Mannschaft2> 
  <Tore01>0</Tore01> 
  <Tore02>0</Tore02> 
  <Tore1>0</Tore1> 
  <Tore2>0</Tore2> 
  <Punkte1>0</Punkte1> 
  <Punkte2>0</Punkte2> 
  <Halle>1220401166</Halle> 
  <Schiri>1220401028</Schiri> 
  <Anmerkung /> 
  <SpielBericht /> 
  <SpielVon>2007-09-09T11:30:00.0000000+02:00</SpielVon> 
  <SpielBis>2007-09-09T12:59:00.0000000+02:00</SpielBis> 
  <Zuschauer>0</Zuschauer> 
  <Heim>TuS Sulingen F2</Heim> 
  <Gast>HSG Mittelweser F1</Gast> 
  <HallenName>Sulingen - Sporthalle Schulzentrum</HallenName> 
  <HallenStrasse>Edenstraße</HallenStrasse> 
  <HallenOrt>27232 Sulingen</HallenOrt> 
  <LigaName>09.09.07 Sulingen 1</LigaName> 
  </Spiel>

Aber leider bekomm ich das nicht hin :frowning:

Ich hoffe ihr habt da eine Idee?

Grüße
Jens

Schade … hat keiner ne Idee dazu? Oder sollte ich das besser mit Hilfe von einer SQL Tabelle machen? Die Einträge wie bisher auslesen und anstatt sie auszugeben in eine Tabelle einfügen … dann läßt sich das auch besser nach Datum sortieren und ausgeben …

Gruß
Jens

nee, nicht sql, sondern XPATH (Abfragesprache von XML). Das geht auch mit PHP. Die Logik ist aber nicht so einfach zu verstehen, wenn man sich noch nie mit XML beschäftigt hat.
In Deinem Beispiel habe ich aber auch noch nicht verstanden, was rauskommen soll.

Tommi

Hi Tommi,

immerhin schon mal ne Antwort :wink:

In meinem Fall möchte ich alle XML Dateien auslesen und dann Zeilenweise die Spielpaarungen ausgeben, mit Spielklasse, Datum, Uhrzeit, Heim und Gastmannschaft.
Mann könnte auch Datei für Datei abarbeiten, das Problem ist dann aber wieder die Ausgabe … das sollte aus Gründen der Übersicht nämlich dem Datum nach sortiert sein.

Gruß
Jens

Ich würde hier alle XML-Dateien auslesen und die Werte in mehrdimesionalen Arrays zwischenspeichern. Alternativ könnte man natürlich auch eine einfache inMemory-DB wie SQLLite nehmen, um statt der Arrays Tabellen zu füttern, weil man bei der Schachtelei der Arrays schnell den Überblick verlieren kann. Anschliessend die Arrays(bzw. Tabellen) der Reihe nach abklappern und dadurch die gewünschte Ausgabe erzeugen.
Tommi

Hmmm … hast du da mal ein paar Codeschnipsel? Arrays sind nicht gerade meine Stärke.

Wenn ich das richtig verstanden habe, dann erstelle ich pro XML Datei ein Array, in das ich dann alle „Spiele“ als einzelne Arrays packe. Das Array der Datei dann in ein weiteres, in das alle anderen Datei-Arrays dann auch kommen. Insgesamt dann also 3 Ebenen … wie kann ich da dann aber per Datum sortieren oder ausgeben? Geht das überhaupt?

SQLLite kenne ich noch nicht … müßte ich mir mal ansehen, obwohl das doch sicher auch installiert werden müßte? Da alles bei einem Provider läuft, nutzt mir das nix … eine SQL Datenbank habe ich jedoch schon zur Verfügung.

Das hier habe ich jetzt um EINE Datei in ein Array einzulesen … wie erweitere ich das um auch die restlichen in das gleiche Array einzulesen?

<?php


$datei = 'test.xml';


if (file_exists($datei))
{

   $xml = simplexml_load_file($datei);
   

   foreach ($xml->Spiel as $platz)
   {
	
	$Testarray[] = array(strtotime($platz->SpielVon), date('d.m.Y.', strtotime ($platz->SpielDatum)), $platz->LigaName, date('H:i', strtotime ($platz->SpielVon)), $platz->Heim, $platz->Gast );

    }
    

}
else
{
   exit('Konnte Datei nicht laden.');
}


?>

Den ersten Eintrag [0] wollte ich nutzen, um die Daten später sortieren zu können, nur wie sortiere ich nach Position[0] ?
Bisher habe ich nur Funktionen gefunden, mit der ich die Zeile sortieren kann … Ausgegeben werden sollen dann später die restlichen Einträge.

Gruß
Jens

Ok, noch eine andere Frage dazu … durch den Code erstelle ich ja ein Array, in dem die erste Postion belegt wird, also $Testarray[0] … in diesem Array sind die Werte der Spiele als Array hinterlegt.
Wenn ich jetzt eine weitere Datei einlese, kann ich die gleiche Funktion dann noch mal nehmen und dann werden die Werte der Spiele in $Testarray[1] geschrieben oder muß ich das anders machen? Vom Prinzip her würde es auch ausreichen wenn ich die weiteren Daten ebenfalls in das Array $Testarray[0] schreibe … also einfach nur hinten anhänge, weil das ja eh das spätere Ziel ist.
Danach kommt erst die Sortierung.

Gruß
Jens

Du bist schon fast fertig. Arrays können auch mehrdimensional sein.
Vielleicht am Anfang ein paar kleine Überlegungungen zum Algorhythmus

z.B.
1.Ich habe d gleichartige Dateien xml-Dateien
2.In jeder Datei finde ich Parameter p1…px unter dem Schlüssel s1…sx
3. Ich brauche aus allen Dateien den Parameter p1 zusammen mi Parameter p3

s1…sx sind bekannt(z.B. SpielVon, Datum usw)
Die Arraylösung:


//Definition:
$myarray=array();
1. Liste der XML dateien in ein Array $files[] einlesen
$files=glob("*.xml");
2. Alle Files nacheinander einlesen
$count=0;
foreach ($files as $xmlfile) {
//Filename ist Schlüssel s0
$myarray[$count]['filename']=$xmlfile;
//jetzt alle werte aus xml rausholen
$xml = simplexml_load_file($xmlfile);
foreach ($xml->Spiel as $platz)
   {
$myarray[$count][$platz]['Von']=$platz->SpielVon; 
$myarray[$count][$platz]['Datum']=$platz->SpielDatum; //usw.
}

....
//jetzt noch die Variable hochzählen
$count++;
}
//statt $count hätte man auch gleich den Filenamen nehmen köbbeb
//jetzt ist alles in $myarray

foreach ($myarray as $id) {
foreach($myarray[$id] as $platz
//und jetzt wieder ausgeben
print $myarray[$id][$platz]['Datum']; //usw
}
}

Als SQLlösung hätte ich eine Tabellen angelegt,die Einträge alle in eine Zeile, die Schlüssel s1…sx als Spalten. Dann einfach ein select drauf.
Bei einigen Providern gehört sqlite per default dazu, einfach mal mit phpinfo(); testen.

Tommi

Hallo Tommi,

vielen Dank noch mal für deinen Vorschlag. Komischerweise sehe ich das erst heute als neuen bzw. noch nicht gelesenen Eintrag …

Ich habe es mittlerweile allein lösen können … na ja, zumindest funktioniert es so wie es soll. Am Code könnte man sicher noch etwas verbessern :wink:

Ich nehme eben meinen Code und benutze ihn für jede XML Datei noch mal und hänge die Daten an das Array an.
Danach wird dann das Array mit array_multisort() sortiert und dann die benötigten Daten ausgegeben.

foreach ($Testarray as $key => $row) {
    $Spielzeit[$key]  = $row[0];

}

array_multisort($Spielzeit, SORT_ASC, $Testarray);

Gruß
Jens