PHP array Inhalt falsch merdimensional rekursiv FOR
Moin Gemeinde,
auch ich hab mal wieder eine coole Frage.
Gerade bastel ich so nebenbei an einer Auswertung eines Bestellsystemes. Das alle Datensätze markieren soll, welche innerhalb kurzer Zeit bestellt wurden.
Beispiel.
2010-07-22 11:42:48
2010-07-22 11:44:14
(mittels substr wird der Wert auf '2010-07-22 11:' gekürzt)
Logik:
Das SQL Statement wird in ein Array gepakt, dadurch entsteht ein merdimensionales Array. Damit ich alle Datensätze zweimal anschaue, werden zwei FOR-Schleifen ineinander gepackt,
diese leuchten mittels IF die beiden aktuellen Datensätze ab, ob dort Gemeinsamkeiten existieren.
(Bestelldatum, Artikelnummer, Lager)
Da das Array jetzt einen Umfang von etwa 1500 Datensätze hat + 20 Untersätze (1500*20 = 30.000) haben wir natürlich einen großen Datenwust!
Aber ich war/bin mir sicher, dass auch PHP dies verkaftet.
Die Datenbank ist postgres.
Problem:
Es werden nicht mehr alle Kombinationen herausgefilter, da händisch nachgewiesen.
Das Konstrukt sieht dann in etwa so aus:
Array > Hauptarray
Ausgabe:
Zur Info:
Es wird in Zeile 3 auf gleiche Lagerorte, Bestelldatum und Artikelnummer kontrolliert.
Mit zwischenzeitlich anderem PHP-Code kamen dann solche Ergebnisse bei heraus:
Genau gleiche Daten mit nur unterschiedlichen counter-Werten der FOR-Schleifen. [j= äußere; i= innere]
Man beachte hier die Zeile 1 und 3 ... ich kann mir nicht erklären, weshalb die Kombination 1505 - 1508 und 1505 - 1510 ein gleiches Ergebnis liefern sollten, wenn mittels print_r($ergebnis); es anders und korrekt ausgegeben wird.
=> Mit obigen hinterlegten PHP - Code werden die Datensätze gar nicht mehr ausgegeben. <=
Mein Ziel ist es, das Array mit sich selbst zu vergleichen und mittels substr und mehreren IFs doppelte Einträge sichtbar zu machen.
Sollte jemand Rückfragen haben oder meinen komplizierten Text nicht verstehen, bitte kurz anschreiben oder kommentieren.
Grüße aus dem bedeckten OWL,
euer Midi
auch ich hab mal wieder eine coole Frage.
Gerade bastel ich so nebenbei an einer Auswertung eines Bestellsystemes. Das alle Datensätze markieren soll, welche innerhalb kurzer Zeit bestellt wurden.
Beispiel.
2010-07-22 11:42:48
2010-07-22 11:44:14
(mittels substr wird der Wert auf '2010-07-22 11:' gekürzt)
Logik:
Das SQL Statement wird in ein Array gepakt, dadurch entsteht ein merdimensionales Array. Damit ich alle Datensätze zweimal anschaue, werden zwei FOR-Schleifen ineinander gepackt,
diese leuchten mittels IF die beiden aktuellen Datensätze ab, ob dort Gemeinsamkeiten existieren.
(Bestelldatum, Artikelnummer, Lager)
Da das Array jetzt einen Umfang von etwa 1500 Datensätze hat + 20 Untersätze (1500*20 = 30.000) haben wir natürlich einen großen Datenwust!
Aber ich war/bin mir sicher, dass auch PHP dies verkaftet.
Die Datenbank ist postgres.
Problem:
Es werden nicht mehr alle Kombinationen herausgefilter, da händisch nachgewiesen.
Das Konstrukt sieht dann in etwa so aus:
Array > Hauptarray
(
=> Array > SQL-Datensätze
(
=> 2010-07-22 09:33:58
[bestellt] => 2010-07-22 09:33:58
[1] =>
[geliefert] =>
[2] =>
[supcontrol] =>
[3] => G55.04212
[liefnummer] => G55.04212
[4] => Katzenhäuschen 4 größe 8
[liefbezeichnung] => Katzenhäuschen 4 größe 8
[5] => G55.04212
[kdnummer] => G55.04212
[6] => Katzenhäuschen 4 größe 8
[kdbezeichnung] => Katzenhäuschen 4 größe 8
[7] => Monster gGmbH
[kunde] => Monster gGmbH
[8] => calc2china
[lieferant] => calc2china
[10] => 17472761473
[transponder] => 17472761473
[11] => Stellplatz 5
[lager] => Stellplatz 5
)
for($j = 0; $j < count($ergebnisse); $j++){
for($i = ($j-1); $i < count($ergebnisse); $i++){
if($i != $j && $ergebnisse[$i]['liefnummer'] == $ergebnisse[$j]['liefnummer'] && $ergebnisse[$i]['lager'] == $ergebnisse[$j]['lager'] && substr($ergebnisse[$i],0,13) == substr($ergebnisse[$j],0,13)){
if($j - $i == 1 || $j - $i == -1)
$ausgabe2 .= "<TR><TD>j=".$j." i=".$i."</TD><TD>".$ergebnisse[$i]."</TD><TD>".$ergebnisse[$i][3]."</TD><TD>".substr($ergebnisse[$i][4],0,12)."</TD><TD>".$ergebnisse[$i][5]."</TD><TD>".substr($ergebnisse[$i][6],0,12)."</TD><TD>".substr($ergebnisse[$i][7],0,12)."</TD><TD>".substr($ergebnisse[$i][8],0,12)."</TD>><TD>".$ergebnisse[$i][10]."</TD><TD>".lagerortshort($ergebnisse[$i]['lager'])."</TD></TR>\n";
$count2++;
}
}
$count++;
}
Ausgabe:
<TR><TD>j=2 i=3 </TD><TD >2010-07-20 13:23:25</TD><TD>G55.04212</TD><TD>Katzenhäuschen 4 größe 8</TD><TD>G55.04212</TD><TD>Katzenhäuschen 4 größe 8</TD><TD>Monster gGmbH</TD><TD>calc2china</TD><TD>17472761473</TD><TD>Stellplatz 5</TD></TR>
Zur Info:
Es wird in Zeile 3 auf gleiche Lagerorte, Bestelldatum und Artikelnummer kontrolliert.
Mit zwischenzeitlich anderem PHP-Code kamen dann solche Ergebnisse bei heraus:
Genau gleiche Daten mit nur unterschiedlichen counter-Werten der FOR-Schleifen. [j= äußere; i= innere]
i=1505 j=1508 2010-07-22 08:07:47 441-16 301221 301221 PAN-16X2-SI Monster gGmbH calc2china 17472761473 BG 02
i=1510 j=1508 2010-07-22 08:06:55 441-16 301221 301221 PAN-16X2-SI Monster gGmbH calc2china 17547307693 BG 02
i=1505 j=1510 2010-07-22 08:07:47 441-16 301221 301221 PAN-16X2-SI Monster gGmbH calc2china 17472761473 BG 02
i=1508 j=1510 2010-07-22 08:07:34 441-16 301221 301221 PAN-16X2-SI Monster gGmbH calc2china 4418947752 E 101
=> Mit obigen hinterlegten PHP - Code werden die Datensätze gar nicht mehr ausgegeben. <=
Mein Ziel ist es, das Array mit sich selbst zu vergleichen und mittels substr und mehreren IFs doppelte Einträge sichtbar zu machen.
Sollte jemand Rückfragen haben oder meinen komplizierten Text nicht verstehen, bitte kurz anschreiben oder kommentieren.
Grüße aus dem bedeckten OWL,
euer Midi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 147465
Url: https://administrator.de/contentid/147465
Ausgedruckt am: 25.11.2024 um 06:11 Uhr
1 Kommentar
for($j = 0; $j < count($ergebnisse); $j++){
#$j ist jetzt 0
for($i = ($j-1); $i < count($ergebnisse); $i++){
#$i ist jetzt -1 (0-1)
#$j ist jetzt 0
for($i = ($j-1); $i < count($ergebnisse); $i++){
#$i ist jetzt -1 (0-1)
Warum?
Verstehe ich nicht.
Der erste Vergleich ist so immer ungültig, weil es kein -1 gibt.
Übrigens gibt es für sowas SQL:
SELECT
GROUP_CONCAT(b.id SEPARATOR ',') AS sim
FROM
bestell a
INNER JOIN
bestell b ON (a.id != b.id AND a.liefnummer = b.liefnummer AND a.lager = b.lager AND b.bestellt BETWEEN a.bestellt - 60*60 AND a.bestellt + 60*60)
GROUP BY
a.liefnummer,a.lager
+------+
| sim |
+------+
| 1,2 |
| 3,4 |
+------+
SELECT * FROM bestell
+------+---------------------+------------+-------+
| id | bestellt | liefnummer | lager |
+------+---------------------+------------+-------+
| 1 | 2010-07-21 12:13:25 | 110 | a |
| 2 | 2010-07-21 12:13:27 | 110 | a |
| 3 | 2010-07-21 15:12:17 | 118 | b |
| 4 | 2010-07-21 15:14:17 | 118 | b |
| 5 | 2010-07-21 17:18:09 | 118 | b |
| 6 | 2010-07-21 19:12:01 | 112 | c |
+------+---------------------+------------+-------+
6 rows in set (0.00 sec)
Mit einer richtig indizierten Tabelle dürfte das seeeeehr viel schneller sein als PHP.