Array Sortierungsfrage

  • Themenstarter Themenstarter scherlomatic
  • Beginndatum Beginndatum
S

scherlomatic

Hallo liebe Community!

Gleich mal zum Problem:

Ich lese aus nem log File Werte mittels fgetcsv() ein, was auch noch funktioniert.
Die werte bestehen als integers, date und strings.

Jetzt ist es so, dass ich quasi ein unique auf mehrere indexe brauche und falls dies TRUE retour liefert, muss ich den counter erhöhen.

Hoffe hab mich soweit klar ausgedrückt.

Noch kurz zur praktischen anwedung, sind Statistikwerte die ich zb.: nach KundenID, DATE usw. sortieren will, und ein quasi "zusammenfassen" erreichen will, womit ich den "hit"-counter immer um 1 erhöhen muss. Warum? Damit ich dann beim DB import an Querys spare.

lg und thx
 
Aber selbstverständlich

Das FILE sieht so aus:
300007;1;"2009-11-06 21:00";A;1
300002;1;"2009-11-06 21:00";A;1
300020;1;"2009-11-06 21:00";A;1
300007;1;"2009-11-06 21:00";A;1

das ganze speichere ich nun in ein temporäres Array:
Array(
[0] => Array(
[0] => 300007
[1] => 1
........
[4] => 1
)
........
)

Sollte jetzt soweit klar sein.
Jetzt will ich aber zur Performance steigerung nicht jeden Befehl einzeln in die DB inserten sondern zuerst einmal mit Hilfe von PHP zusammen fassen.

wie man sieht sind die 1. und 4. Zeile (0. und 3. Array) identisch, und somit gehört hier ein counter um eins erhöht.

schön wäre es, wenn ich dann ein Array von dieser Form bekommen könnte:
Array(
[0] => Array(
[0] => 300007
[1] => 1
........
[5] => 2 /* hier wird der counter gespeichert */
)
.....
)

In meiner DB-Tabelle gibt es selbstverständlich ein integer feld für den counter.


Wenns bessere Lösungsvorschläge gibt wär ich selbstverständlich auch dankbar. Nur sollte es sehr performant sein, da hier 10000 lines / h entstehen oder mehr.


lg
 
Du könntest den gesamten Datensatz als Schlüssel eines weiteren Array nehmen, in dem dann die Anzahl der Vorkommen gezählt wird:
PHP:
$counter = array();
foreach ($lines as $line) {
    if (!isset($counter[$line])) {
        $counter[$line] = 1;
    } else {
        $counter[$line] += 1;
    }
}
 
danke mal für den tipp

hast aber nen kleinen typo drin.

sollt so ausschauen:
$counter = array();
foreach ($lines as $line) {
if (isset($counter[$line[0]])) {
$counter[$line[0]] += 1;
} else {
$counter[$line[0]] = 1;
}
}


allerdings ist das nur die halbe miete, da die original werte doch noch immer doppelt drin sind und ein array_unique doch nicht das richtige bringt.

lg
 
Wenn du den gesamten Datensatz als Schlüssel verwendest, kannst du diesen auch später noch verwenden. In diesem Fall kannst du einfach $counter durchlaufen und den jeweiligen Schlüssel parsen.
Oder du verwendest nur den ersten Wert eines jeden Datensatzes als Schlüssel (so wie du es momentan machst) um damit dann wiederum die eigentlichen Daten aus einem zweiten Array zu holen – oder gleich beides in einem:
PHP:
$data = array();
foreach ($lines as $line) {
    if (!isset($data[$line[0]])) {
        $data[$line[0]] = array('counter'=>1, 'data'=>$line);
    } else {
        $data[$line[0]]['counter'] += 1;
    }
}
 
Zurück