• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

explode Frage

BigSanch

Neues Mitglied
Hi

Folgendes Problem:
Ich habe eine Datenbank aus der Ergebnisse aus einer Tabelle ausgelesen werden, welche in folgendem Format eingtragen sind: Tabelle: e1,e2,e3,e4 (usw).
Es gibt keine feste Zahl der Einträge, wenn es 20 Aktionen gibt, dann werden auch 20 Ergebnisse eingetragen ist also im Moment nicht nachvollziehbar, wieviele Daten in der Tabelle drin sind.

Ich lese diese wie folgt aus:
PHP:
$erg=explode(",",$wsc["regebnis"]); for($i=0; $i<count($erg); $i++){$rg+=$erg[$i]; $rge.=$erg[$i].'<br />';}
Somit gibt er mir alle einzelnen Ergebnisse mit je einem Zeilenumbruch aus. Was soweit auch funktioniert.

Nun ist es aber so, dass immer, egal ob 10 oder 50 Einträge drin stehen, zwei aufeinander folgende Einträge zusammengehören für Details: e1,e2,e3,e4 (usw)
sollte also in der Detailansicht so aussehen: (e1,e2),(e3,e4) (usw)[/CODE]

Jeder Eintrag ist mit einem "," getrennt, wie kann ich nun mit explode für eine Detailansicht immer alle 2 Einträge auslesen und zusammenaddieren lassen.

Zum besseren Verstehen ein Beispiel:

Datentabelle: 3,5,6,7,13,22
Auslesebefehl: $erg=explode(",",$wsc["regebnis"]); for($i=0; $i<count($erg); $i++){$rg+=$erg[$i]; $rge.=$erg[$i].'<br />';}
ergibt folgende Ausgabe:

3
5
6
7
13
22

Nun will ich für eine Detailansicht die zusammengehörenden Einträge zusammenfassen:
Datentabelle: 3,5,6,7,13,22
Damit meine Ausgabe dann so aussieht:

8
13
35

Hoffe jemand kann mir helfen

MfG
 
PHP:
$wsc["regebnis"] = "3,5,6,7,13,22";
$erg=explode(",",$wsc["regebnis"]);

for($i=0; $i<count($erg); $i+=2)
{
    $rge .= $erg[$i] + $erg[$i+1].'<br />';
}

echo $rge;

Ausgabe:

8
13
35
 
Sprich die Ergebnisse in eine Zwischentabelle auslagern, wahlweise direkt zusammengefügt (fals da kein argument gegen spricht) oder einzeln.
 
Sprich die Ergebnisse in eine Zwischentabelle auslagern
Nein, eine Zwischentabelle ist nicht Normalisierung. Falls es wahr ist, daß die Werte immer paarweise zusammengehören, müßten in der Tabelle 2 Spalten vorhanden sein, die so verriegelt werden, daß sie beide leer oder beide mit gültigen Werten belegt sind.
Mit Sicherheit ist eine paarweise Zusammenfassung von Zeilen im Sinne der Normalisierung ganz falsch; Datensätze haben keine Reihenfolge. Die müssen auch ohne Vorgänger oder Nachfolger gültig sein.
Etwas genaues kann man aber nur sagen, wenn man die Aufgabe der Tabelle kennt.
 
Hi
Danke erstmal an alle Antworten

@Kai
Danke das hatte ich auch schon im Sinn, das Problem ist dass das nicht immer die selbe Anzahl an Einträgen sind, es kann auch sein, dass da statt wie in dem Beispiel 3 zweierblöcke auch ma 8 oder 15 drin sind.

@Rest
Mit Normalisiern kann ich grad nichts anfangen :-)
In ne Zwischentabelle auslagern, tja wenn ich wüsste wie, denn wie oben beschrieben weiss man nie wieviel in der Tabelle drin steht, das heisst, es müsste ein Einheitscode werden, welcher egal wieviel Einträge drinstehen, diese Paarweise addiert und ausgibt.

@Achtelpetit
Etwas genaues kann man aber nur sagen, wenn man die Aufgabe der Tabelle kennt.

Folgendermassen, es werden nach einem ausgetragenem Spiel Punkte vergeben. Diese Punkte werden in eine Datenbank eingespeist. Da es sich um zwei Runden handelt, stehen immer zwei Aufeinanderfolgende Einträge drin, die zusammen ein komplettes Spiel geben. Wenn nun 4 Spiele gespielt werden, wären da 8 Zwischenergebnisse und 4 Hauptergebnisse. Es können Spiele gespielt werden soviele man will.
In einer Aufstellung der Ergebnisse werden die Ergebnisse ausgegeben als gesamtes, also alle 4 Spiele in dem Fall als ganzes, das heisst es stehen 2 Werte da, Spieler 1 und Spieler 2 Ergebnisse.
In einer Detailansicht des spiels, lasse ich die einzelnen Runden auflisten und mit Ergebnissen ausfüllen, das geht auch noch. In einer weiteren Liste sollten dann nur die einzelnen Spiele, nicht die Runden, also Wert 1 und Wert 2 zusammengefüht da stehen. Das wären in dem Fall dann für Spieler 1 2 Ergebnisse und für Spieler 2 2 Ergebnisse.

Ich hoffe das war verständlich :-) wenn nicht versuch ichs nochmal :-)

MfG
 
Ich hoffe das war verständlich
Nicht sehr. Ich könnte das so verstehen:
Ein Spiel hat immer genau 2 Spieler.
Das Ergebnis eines Spiels besteht immer aus den Punkten für Spieler A und den Punkten für Spieler B.
Die Punktzahl ist immer eine ganze Zahl, größer als 0
Ein Spiel ist unabhängig vom vorhergehenden Spiel

Ist das richtig?

Edit:
Ich hab' nicht richtig gelesen.
Es gibt immer ein Hin- und ein Rückspiel (sozusagen), die zusammengehören?
 
Zuletzt bearbeitet:
@Kai
Danke das hatte ich auch schon im Sinn, das Problem ist dass das nicht immer die selbe Anzahl an Einträgen sind, es kann auch sein, dass da statt wie in dem Beispiel 3 zweierblöcke auch ma 8 oder 15 drin sind.
Wo liegt da das Problem? Wenn es 8 sind dann wird die for-Schleife (durch count(...)) 8-mal durchgegangen, wenn es 15 sind 15-mal.
 
@alogheo
Man kann untaugliches DB-Design durch allerlei Array- und Schleifen-Gefummel überdecken.
Man kann auch mit einem Schraubenzieher einen Nagel in die Wand schlagen. Wollen wir das?
 
Sry für die verspätung, war unterwegs (LKW)

Ja das ist richtig, es gibt immer ein Hin und Rückspiel.
Das Problem ist aber auch dass es unendliche Runden geben kann, also wenn du mit mir spielen würdest, dann könnten wir 3 oder 8 Runden spielen.
Jede Runde hat ein Hin und Rückspiel, also pro Runde 2 Parts.

Also wir spielen Runde 1:
--Part 1 gewinnst du mit sagen wir mal 10:5
--Part 2 gewinne ich mit 8:7

Wir spielen Runde 2:
--Part 1 gewinnst du mit 12:3
--Part 2 gewinne ich mit 11:4

Das heist Runde 1 steht es 17:13 für Dich.
Das heist Runde 2 steht es 16:14 für Dich.

So kann es etliche Runden geben.

In die Datenbank wird nun eingetragen:
(Tabelle gegner): 10,7,12,4
(Tabelle eigene): 5,8,3,11

Ausgabe dann In der Übersicht, mit der Gesamtausgabe 23:7, das funktioniert
Ausgabe Detailansicht, mit den Einzelausgaben 10:5, 8:7, 12:3, 11:4, das funktioniert auch.

Wo ich hänge ist, die Ausgabe Rundenbasierend auszugeben, mit der vorhandenen Datenbank.
Also aus den Einträgen:
---(Tabelle gegner): 10,7,12,4
---(Tabelle eigene): 5,8,3,11
die Ausgabe
---Runde 1 steht es 17:13 für Dich.
---Runde 2 steht es 16:14 für Dich.
zu machen.
Dazu müsste man immer zwei aufeinanderfolgende Datensätze addiern.
Da es unendlich Runden sein können, weiss ich nun nicht wie ich das realisieren kann.
Denn es könnte ja auch so aussehn:
Also aus den Einträgen:
---(Tabelle gegner): 10,7,12,4,15,10,2,7
---(Tabelle eigene): 5,8,3,11,0,5,13,8
die Ausgabe
---Runde 1 steht es 17:13 für Dich.
---Runde 2 steht es 16:14 für Dich.
---Runde 3 steht es 25:05 für Dich.
---Runde 4 steht es 21:09 für Mich.

Ich hoffe es kann jemand helfen :-)
 
Geh' mal einen Schritt zurück. Du sagst sehr viel, aber die Fragen sind nicht beantwortet:

Ein Spiel hat immer genau 2 Spieler.
Eine Runde besteht immer aus genau 2 Spielen (Hin- und Rückspiel).
Das Ergebnis eines Spiels besteht immer aus den Punkten für Spieler A und den Punkten für Spieler B.
Die Punktzahl ist immer eine ganze Zahl, größer als 0
(Bitte beachte daß "immer" auch so gemeint ist.)

Ist das so richtig?
 
Ja, alles richtig und immer auch. Die einzige Variable welche nicht fest steht ist die der Rundenanzahl.
Ansonsten sind alle deine Aussagen richtig

MfG
 
Gut, wenn die Voraussetzungen so sind, dann brauchst Du folgende Tabellen:

Tabelle Spieler
spieler_id | spieler

Tabelle Runden
runde_id | spieler_id_a | spieler_id_b | abgerechnet

Tabelle Spiele
spiel_id | runde_id | punkte_spieler_a | punkte_spieler_b

Du gruppierst einfach die Tabelle Spiele nach "runde-id" und summierst die Punkte der Spieler. Wenn eine Runde nicht aus genau 2 Spielen besteht, war sie nicht vollständig und wird verworfen (oder wie auch immer die Spielregeln lauten).

Edit:
Mir ist noch was eingefallen, in Tabelle Runden habe ich noch das Feld "abgerechnet" eingefügt. Das wird ausgefüllt (vielleicht mit einem Zeitstempel) eben wenn die Runde abgerechnet wird, sonst wird ja immer weiter summiert, das ist ja vielleicht nicht gewollt.
 
Zuletzt bearbeitet:
Zurück
Oben