Sie befinden sich hier im Forenarchiv von phpforum.de wenn Sie direkt ins Forum möchten, klicken Sie bitte hier. Zur Startseite kommen Sie hier.

probleme mit in_array

ich möchte mehrfacheinträge aus einem array in eine csv datei schreiben. dabei sollen diese jeweils nur einmal vorkommen.
mein code sieht so aus:

Code:                   In Zwischenablage kopieren (nur IE)
1">

es sollte so sein dass wenn ein bestimmter wert in die csv datei geschrieben wird, er in das array $ergebnisdatei geschrieben wird.
jedesmal bevor ein neuer wert in die csv datei geschrieben wird soll überprüft werden ob er in $ergebnisdatei schon existiert, wenn nicht ist es ok falls doch soll mit dem nächsten wert fortgefahren werden.
das macht es jedoch nicht. es werden nach wie vor mehrfacheinträge produziert.
Hier gehts zum Orginal Eintrag "probleme mit in_array" im Forum

Antworten

ich verstehe Deine innere Schleife nicht, was genau überprüfst Du da? Ansonsten würde ich "ergebnisdatei" als assoziatives Array mit dem Wert aus "alleZeilen" als Schlüssel und "true" als Wert anlegen, dann kannst du eine einfache überprüfung der Art

if (!$ergebnisdatei[$neuerWert]) {
}

machen. Und dann noch ein Performance-Tipp: Öffne die CSV-Datei nur einmal vor Beginn der Schleife, das sollte wesenlich schneller gehen als sie bei jedem Schreibzugriff neu zu öffnen...


2.

was ich da überprüf?
das ganze ist so: Ich habe eine csv datei mit ca. 1600 einträgen. da möchte ich jetzt einträge die in einer bestimmten spalte den gleichen wert haben sammeln und in eine neue csv datei schreiben.
also lese ich zuerst die csv in ein array ein und gehe diese dann zeile für zeile durch in der ersten schleife.
der vergleich wird in der zweiten for schleife gemacht indem ich den in der ersten schleife gewählten wert $...[$i][16] mit den werten in den nachfolgenden werten vergleiche $....[$a][16].
das funktioniert auch solange ein wert nur zweimal vorkommt. kommt er dreimal vor so würde ich folgendes ergebnis haben:
1.wert --> 2.wert
1.wert --> 3.wert
....
2.wert --> 3.wert

da das letzte ergebniss in dem vorherigen aber schon enthalten ist wollte ich sowas mit in_array unterbinden.
der wert der schon mit einem paar verglichen wurde wird in das kontroll array geschrieben.
$ergebnisdatei[] = $alleZeilen[$i][16];

mit diesem werden dann vor jedem vergleich geprüft ob dieser wert schon erledigt ist.
funktioniert nur leider nicht. es kommt kein fehler, es macht nur nicht was es soll.


3.

Versuch mal mit assoziativen Arrays zu arbeiten, die sind effizienter. Dann kannst Du Dir Deine innere Schleife komplett schenken.


4.

würd ich machen wenn ich ne ahnung davon hät. das skript brauch ich aber bald.
es funktioniert ja alles außer die kontrolle mit dem in_array.
ich hab mir die werte aus dem array mal ausgeben lassen, alles in ordnung.
also muss der fehler in der if - funktion liegen, oder?


5.

Ehrlich gesagt lässt sich dein Skript kaum auf die schnelle Verifizieren, zumindest will mir das heute nach der durchzechten Nacht nicht so richtig gelingen. Ich denke, es lohnt sich auf jeden Fall diesen Algorithmus nochmal grundlegend zu überdenken und neu zu schreiben...


6.

danke für die antwort.

:( :( :( :(

falls doch noch jemand ne lösung sieht bitte melden...


7.

assoziative arrays haben als key einen string.

$arr['hallo']['welt'] = "hallo welt";

echo $arr['hallo']['welt']

Ausgabe: hallo welt


8.

was willst du mir damit sagen?


9.

es geht jetzt, ich weis nur nicht warum. vielleicht kann mir ja von euch einer sagen warum:

zuerst hatte ich das ganze so:

Code:                   In Zwischenablage kopieren (nur IE)
2">

wenn ich im prinzip nichts ändere funktionierts:

Code:                   In Zwischenablage kopieren (nur IE)
3">

ich hab nur die schreibweise der variable geändert, von nem array zu ner normalen variable...
versteh ich nicht, bin aber trotzdem froh...


10.

Zitat:
oimel posteteVersuch mal mit assoziativen Arrays zu arbeiten, die sind effizienter. Dann kannst Du Dir Deine innere Schleife komplett schenken.
Zitat:
chrisnolde postete
würd ich machen wenn ich ne ahnung davon hät.
dann hab ich dir das mal kurz erklärt....und dann.....

Zitat:
chrisnolde postete
was willst du mir damit sagen?
falls du noch nicht drauf gekommen bist, wieso ich das gepostet habe, dann hier nochmals eine erklärung:

oimel hat den vorschlag gemacht, assoziative array zu verwenden, dann hast du geschrieben, dass du das machen würdest, wenn du eine ahnung davon hättest, da hab ich mir gedacht, wenn jemand im forum schreibt, er würde was machen, wenn ahnung, sich eigentlich über eine erklärung freuen würde.....lange rede gar kein sinn, da dein problem offenbar gelöst ist....


11.

bin ja auch dankbar für jede antwort. ;)
also sind ass. arrays nur ganz normale arrays die anstelle der normalen indizees [0], [1],...
einfach selbstdefinierte strings haben?

dann kapier ich aber immernoch nicht wieso die effizienter sein sollen... werd mal drüber grübeln.

und warum es bei mir so jetzt funktioniert kannst du mir zufällig nicht sagen?


12.

Assoziative Arrays heißen so, weil ein bestimmter Schlüssel mit einem Wert assoziiert wird, oder eben anders ausgedrückt: Statt numerischer Indizes kannst Du jedes beliebige Objekt zur Indizierung hernehmen.

Das hat den Vorteil, dass man Suchanfragen sehr effizient gestalten kann. Angenommen, Du hast viele Texte mit jeweils einer Liste von Schlüsselwörtern, so könntest Du zuordnen:

$zugriffsarray["schlüsselwort"]=array(...Liste mit allen Texten, die "schlüsselwort" enthalten);

Somit könntest Du alle Texte, die ein bestimmtes Schlüsselwort enthalten, mit der einfachen Zeile:

$zugriffsarray["schlüsselwort"]

erhalten. PHP sorgt dann (hoffentlich) selbst dafür, dass die Suche in möglichst linearer Zeit funktioniert.


Hier gehts zum Orginal Eintrag "probleme mit in_array" im Forum
 
phpforum.de | Impressum