CSV File durchsuchen und Array ausgeben
Meister
- php
Hallo,
nach 12 Mio vergeblichen Google suchen versuche ich es nun mal hier selber mit einem Eintrag :o( Vielleich kann mir ja jemand helfen:
Ich habe eine PHP Seite in der ich eine csv Datei einlese und als Tabelle ausgebe. Das ist nicht das Problem - hab ich noch hinbekommen :o)
Nun möchte ich aber noch eine Suche anbieten, mit der ich über die gleiche csv datei suchen kann und die mir dann eine zeile mit dem suchwort ausgibt (für die scrollfaulen ;o) ). Bsp:
suche: abc
csv datei:
1;abc;dfs;
2;tegds;sdf;
3;sdf;sad;
ergebnis das durch die suche ausgegeben wird :
1;abc;dfs;
Kann mir jemand eine Idee oder Codeschnipsel :) geben?
Danke und Gruß
Ach so:
Das ich ein Formularfeld über die Liste stelle ist klar :o)
<form action="suche.php" method="post"> //meinetwegen auch get ...
Bitte geben Sie ihren Suchbegriffein:
<input type="text" name="suche" />
<input type="submit" />
</FORM>
Hi,
Ich habe eine PHP Seite in der ich eine csv Datei einlese und als Tabelle ausgebe. Das ist nicht das Problem - hab ich noch hinbekommen :o)
suche: abc
csv datei:
1;abc;dfs;
2;tegds;sdf;
3;sdf;sad;ergebnis das durch die suche ausgegeben wird :
1;abc;dfs;
Lies einfach trotzdem das ganze File ein und lass nur die Zeilen ausgeben, in denen dann das Suchwort vorkommt.
mfG,
steckl
Hi,
Ich habe eine PHP Seite in der ich eine csv Datei einlese und als Tabelle ausgebe. Das ist nicht das Problem - hab ich noch hinbekommen :o)
suche: abc
csv datei:
1;abc;dfs;
2;tegds;sdf;
3;sdf;sad;ergebnis das durch die suche ausgegeben wird :
1;abc;dfs;Lies einfach trotzdem das ganze File ein und lass nur die Zeilen ausgeben, in denen dann das Suchwort vorkommt.
mfG,
steckl
Hi!
Das habe ich probiert aber bekomme es nicht hin. Wie kann ich die Ausgabe denn Einschränken? Den Suchbegriff bekomme ich ja per Variable mit.
Gruß
Hi,
zuerst mal versuche etwas sinnvoller zu zitieren.
Lies einfach trotzdem das ganze File ein und lass nur die Zeilen ausgeben, in denen dann das Suchwort vorkommt.
Das habe ich probiert aber bekomme es nicht hin. Wie kann ich die Ausgabe denn Einschränken? Den Suchbegriff bekomme ich ja per Variable mit.
Wäre gut, wenn du etwas Quellcode zeigen würdest, sonst kann man nur raten.
mfG,
steckl
Klaro.
Hier das Suchfeld:
***************
//suche
<form action="402_suche.php" method="post">
Bitte geben Sie ihren Suchbegriff ein:
<input type="text" name="suche" />
<input type="submit" />
</FORM>
***************
Und hier der php Teil der die Datei auslist und in tabellenform ausgibt:
***************
<?php
// Anfang Übersicht
$datei = "werte.csv";
$array = file($datei);
$icon = '<img src = "pics/sound.jpg">';
$limit = $_GET["limit"];
if($limit == "all"){ // alles anzeigen
for ($zaehler = 0; $zaehler < count($array); $zaehler++) {
$array[$zaehler] = explode(";" , $array[$zaehler]);
//echo "<tr><th>" . ($zaehler+1) . "</th>" ; // Zeilennummer
for ($a = 0; $a < 7; $a++) { // 7 Tabellenspalten
if ($a == 6) {
echo "<td><a href="zeuch/" . $array[$zaehler][$a] . "" target="_blank">" . $icon . "</a></td> \n";
}
else {
echo "<td>" . $array[$zaehler][$a] . "</td> \n";
}
}
echo "</tr> \n";
}
//Ende Übersicht
***************
Danke und Gruß
Hi,
> ***************
> <?php
>
> // Anfang Übersicht
> $datei = "werte.csv";
> $array = file($datei);
> $icon = '<img src = "pics/sound.jpg">';
> $limit = $_GET["limit"];
In dem Formular oben gibts kein Feld, das limit heisst, ausserdem wird es mit POST verschickt.
> if($limit == "all"){ // alles anzeigen
>
> for ($zaehler = 0; $zaehler < count($array); $zaehler++) {
> $array[$zaehler] = explode(";" , $array[$zaehler]);
Hier noch eine Schleife machen, in der du abprüfst, ob in $array[$zähler] irgendwo $_POST['suche'] drinsteht. Dann wenn es gefunden wurde beispielsweise eine neue Variable $found auf 1 setzen.
Die folgenden Ausgaben nur machen, wenn $found==1.
> //echo "<tr><th>" . ($zaehler+1) . "</th>" ; // Zeilennummer
Das <tr> solltest du nicht auskommentieren.
> for ($a = 0; $a < 7; $a++) { // 7 Tabellenspalten
> if ($a == 6) {
> echo "<td><a href=\"zeuch/" . $array[$zaehler][$a] . "\" target=\"_blank\">" . $icon . "</a></td> \n";
> }
> else {
> echo "<td>" . $array[$zaehler][$a] . "</td> \n";
> }
> }
> echo "</tr> \n";
> }
mfG,
steckl
Hi,
danke für die schnelle Hilfe schonmal. Ich poste jetzt mal den kompletten Code mit Anpassung, die ich aber wohl mit meinen mageren Kentnissen noch nicht so ganz richtig habe....
***************
<?php
// Anfang Übersicht
$datei = "werte.csv";
$array = file($datei);
$icon = '<img src = "pics/sound.jpg">';
$limit = $_GET["limit"];
if($limit == "all"){ // alles anzeigen
for ($zaehler = 0; $zaehler < count($array); $zaehler++) {
$array[$zaehler] = explode(";" , $array[$zaehler]);
if ($array[$zähler] == $_POST['suche']){
$found = 1;
}
if ($found == 1){
echo "<tr><th>" . ($zaehler+1) . "</th>" ; // Zeilennummer
for ($a = 0; $a < 7; $a++) { // 7 Tabellenspalten
if ($a == 6) {
echo "<td><a href="zeuch/" . $array[$zaehler][$a] . "" target="_blank">" . $icon . "</a></td> \n";
}
else {
echo "<td>" . $array[$zaehler][$a] . "</td> \n";
}
}
echo "</tr> \n";
}
//Ende Übersicht
***************
Ich werde noch etwas forschen müssen damit es klappt... oder ? ;)
Hi,
Hab mal paar sachen dazugeschrieben, aber weiß nicht, ob das schon alles war.
> ***************
> <?php
>
> // Anfang Übersicht
> $datei = "werte.csv";
> $array = file($datei);
> $icon = '<img src = "pics/sound.jpg">';
> $limit = $_GET["limit"];
Diese Zeile ist wohl immernoch sinnlos, wenn du die Seite mit dem Formular das du vorhin gepostet hast aufrufst.
> if($limit == "all"){ // alles anzeigen
Hier überprüfst du eine Variable, die eigentlich keinen Wert haben sollte, ob "all" drinsteht.
> for ($zaehler = 0; $zaehler < count($array); $zaehler++) {
Hier müsstest du bei jedem Durchlauf $found wieder auf 0 setzen.
> $array[$zaehler] = explode(";" , $array[$zaehler]);
>
> if ($array[$zähler] == $_POST['suche']){
$array[$zähler] ist ebenfalls ein Array, also kannst du es nicht so einfach mit einem String vergleichen. Hab gerade gesehen, dass es eine Funktion namens [link:http://de.php.net/manual/de/function.array-search.php@title=array_search] gibt, die das für dich erledigt. Die könntest du dann gleich in der Bedingung beim nächsten if verwenden, dann könntest du dir die zusätzliche Variable $found (die ich dir vorher vorgeschlagen habe) sparen.
> $found = 1;
> }
> if ($found == 1){
> echo "<tr><th>" . ($zaehler+1) . "</th>" ; // Zeilennummer
> for ($a = 0; $a < 7; $a++) { // 7 Tabellenspalten
> if ($a == 6) {
> echo "<td><a href=\"zeuch/" . $array[$zaehler][$a] . "\" target=\"_blank\">" . $icon . "</a></td> \n";
> }
> else {
> echo "<td>" . $array[$zaehler][$a] . "</td> \n";
> }
> }
> echo "</tr> \n";
> }
> //Ende Übersicht
>
> ***************
mfG,
steckl
Das stimmt - die Funktion gibts tatsächlich! Ich bekomme sie nur nicht so richtig zum laufen. Im Moment zeit er keine Ergebnisse an..
Das unnötige habe ich jetzt mal wieder entfernt.
»»<?php
»»
$datei = "werte.csv";
$array = file($datei);
$icon = '<img src = "pics/sound.jpg">';
for ($zaehler = 0; $zaehler < count($array); $zaehler++) {
$array[$zaehler] = explode(";" , $array[$zaehler]);
»»
if ( $found = array_search ( $_POST['suche'], $array ) )
»» {
»»
echo "<tr><th>" . ($zaehler+1) . "</th>" ; // Zeilennummer
»»
for ($a = 0; $a < 7; $a++) { // 7 Tabellenspalten
if ($a == 6) {
echo "<td><a href="zeuch/" . $array[$zaehler][$a] . "" target="_blank">" . $icon . "</a></td> \n";
}
else {
echo "<td>" . $array[$zaehler][$a] . "</td> \n";
}
}
echo "</tr> \n";
}
}
end;
»»?>
Gruß
Ach Mist... ich geb ja die $found auch gar nicht mit dann...uups
Hi,
if ( $found = array_search ( $_POST['suche'], $array ) )
Das $found kannst auch weglassen. Aber lass dir mal $array hier ausgeben (z.B. mit vardump), da steht nicht das drin, was du wohl erwartest.
Du würdest das ganze für dich einfacher machen, wenn du oben das Ergebnis von explode() in ein neues Array schreibst und nicht wieder in $array.
mfG,
steckl
Danke für den Tipp :o)
Ich habe wieder rumgestrickt, aber ich bekomme als Ergebnis im Moment nur 46x Nichts gefunden... so viele Zeilen hat das File.
[code lang=php]
<?php
$datei = "werte.csv"; // Datei mit allen Predigten
$array = file($datei); // Datei in ein Array einlesen
for ($zaehler = 0; $zaehler < count($array); $zaehler++) {
$liste = explode(";" , $array[$zaehler]);
// var_dump ($liste); --> hier kommt die Liste meines Erachtens richtig an
if ( array_search ( $_POST['suche'], $liste ) )
{
//var_dump ($liste); --> da bekomme ich gar kein Ergebnis
echo "<tr><th>" . ($zaehler+1) . "</th>" ; // Zeilennummer
echo 'treffer';
}
else {
echo "<tr>Nichts gefunden</tr>";
}
}
?>
Hi,
das Tag muss nachher auch wieder geschlossen werden. das geht mit [ /code] (nur ohne das Leerzeichen)
Man kann auch mit der Vorschau-Funktion testen, ob man die Tags richtig gesetzt hat.
[code lang=php]
for ($zaehler = 0; $zaehler < count($array); $zaehler++) {
$liste = explode(";" , $array[$zaehler]);
// var_dump ($liste); --> hier kommt die Liste meines Erachtens richtig anif ( array_search ( $_POST['suche'], $liste ) )
Hast du auch $\_POST['suche'] mal angeschaut?
Ausserdem muss $\_POST['suche'] alleine in einem Element von $liste sein und nicht nur ein Teilstring davon.
mfG,
steckl
Hm nicht mal das code markieren hat geklappt! ;)
Also das $_POST['suche']liefert schon genau den Wert der mitgegeben wird. Allerdings denke ich das die if anweisung nicht passt..
»»Ausserdem muss $_POST['suche'] alleine in einem Element von $liste sein und nicht nur ein Teilstring davon.
Hm. Ich glaube das ist doch ne Nummer zu groß für mich leider :(
Hi,
Hm nicht mal das code markieren hat geklappt! ;)
Das ist das kleinste Problem :)
Also das $_POST['suche']liefert schon genau den Wert der mitgegeben wird. Allerdings denke ich das die if anweisung nicht passt..
Versuch mal das von Tom vorgeschlagene in_array() anstatt array_search(). Das kannte ich auch nicht, da ich PHP eigentlich nicht so gerne mag.
Zur überprüfung kannst du ja das Ergebnis noch in eine Variable speichern und diese dann zum Testen ausgeben.
»»Ausserdem muss $_POST['suche'] alleine in einem Element von $liste sein und nicht nur ein Teilstring davon.
Heisst nur, dass wenn in $_POST['suche'] "abc" steht, wenn in der Liste "abcd" steht nicht als Treffer anerkennt, weil "abc" nicht "abcd" ist. Ausserdem ist "ABC" nicht das gleiche wie "abc".
mfG,
steckl
Heisst nur, dass wenn in $_POST['suche'] "abc" steht, wenn in der Liste "abcd" steht nicht als Treffer anerkennt, weil "abc" nicht "abcd" ist. Ausserdem ist "ABC" nicht das gleiche wie "abc".
Ja das ist wirklich ein (mein :) ) Problem.. Ich sehe ja durch das var_dump zurück kommt und das ist tatsächlich eher nicht so gut für die Suche.
Vielleicht versuche ich einen komplett anderen Ansatz... Liste komplett in einer Seite ausgeben lassen und dann mit Javascript eine suche basteln die an die Treffer stelle springt / markiert o.ä. Da ich auf dem Bereich aber kaum Ahnung habe wird das wohl eher eine Scriptsucherei... :o(
Danke für Deine Hilfe! Weitere Ideen sind natürlich herzlich willkommen :o)
das könnte helfen denke ich:
http://www.webbe.de/index.shtml?CONTENT=script_javascript_site_search;LANG=de
:)
Hi,
Danke für Deine Hilfe! Weitere Ideen sind natürlich herzlich willkommen :o)
Du könntest ja auch mit einer anderen Funktion die Liste durchsuchen. Dann könntest du auch nach Teilstrings suchen oder Groß- und Klein-Schreibung ignorieren.
Beispielsweise könntest du dann preg_match() benutzen. Das kannst du zwar immer nur auf ein Element der Liste anwenden, aber dann musst du das ganze eben in einer Schleife machen.
mfG,
steckl
Hello,
Lies einfach trotzdem das ganze File ein und lass nur die Zeilen ausgeben, in denen dann das Suchwort vorkommt.
Mit PHP-Funktionen kann man (sinnvoll) noch keine ganzen CSV-Files einlesen auf einmal, sondern "zeilenweise" sequentiell lesen.
Es ist daher also sinnlos, das ganze File im Speicher zu halten, wenn man z.B. nur den ersten Treffer haben will.
Auch wenn man alle Treffer haben will, ist es sinnlos.
Benötigt wird die CSV-Lesefunktion und die Funktion in_array() oder array_search()
[http://www.php.net/manual/de/function.fgetcsv.php] -> ezeutgt ein Array aus der Zeile
http://www.php.net/manual/de/function.in-array.php -> sucht nach dem Element in dem Array
http://www.php.net/manual/de/function.array-search.php -> sucht nach dem Element in dem Array und liefert den Schlüssel
Ohne Schleife (while) und Bedingung (if) wird es also nicht gehen.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
habe mir den weiteren Thread auch angeschaut und möchte dazu bemerken, dass Du Die angewöhnen solltest
- Eingabe
- Verarbeitung
- Ausgabe
also die strikte Trennung in
Datenübernahme vom Client (aus dessen Aufrufparametern und Uploads)
Kontrolle dieser Daten
Erkennung der Wünsche des Client
Kontrolle der Wünsche
Bereitstellug der benötigten Daten
Verarbeitung der Daten gemäß der Wünsche
Bereitstellung des unformatierten Ergebnisses
Erzeugung des formatierten Ergebnisses in HTML und/oder anderen Protokollen
Dann wirst Du auch durchsteigen durch Deine Scripte.
PHP bietet für die Weitergabe der gesammelten Ergebnismenge die leistungsstarken "Arrays". Die sollte man soviel wie möglich einsetzen, wenn es nicht um absolutes Geschwindigkeits-Optimieren gehen sollte...
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom