Suche wird nicht mehr ausgegeben
Peter
- php
Hallo,
ich habe eine CD-Suche mit php geschrieben, wobei eine "Datenbank" auf diese Cd durchsucht wird. Das hat geklappt, wenn ich die "Datenbank" mit einem array-Befehl aufgelistet habe. Jetzt wollte ich die "Datenbank" jedoch aus einer Textdatei einbinden und sortieren, sodass die "Datenbank" durchsucht wird. Jetzt wird jedoch die Suche nichtmehr durchgeführt. Sieht einer meinen Fehler und kann mir diesen auch sagen?
abfrage_1.php
<html>
<body>
<form action="auswertung.php" method="post">Suche
<input type="text" name="cd_suche" />
<input type="submit" value="abschicken" /></body></html>
auswertung.php
<html>
<head>
<title>Suche</title>
</head>
<body bgcolor="yellow">
<div align="center">
<h2>Meine CD-Sammlung besteht aus:</h2>
<?php
$cd_suche=$_POST['cd_suche'];
$cd = file ( 'sammlung.txt' );
for ( $x = 0; $x < count ( $cd ); $x++ ){
sort($cd);
foreach ($cd as $x => $y) {
echo $cd[$x] . '<br>';
} }
echo "<h2>Wo steckt die verfluchte ".$cd_suche."-CD?</h2>";
$links = 0;
$rechts = count($cd)-1;
while ($links <= $rechts){
$mitte = floor(($links + $rechts)/2) ;
if ($cd[$mitte] == $cd_suche){
$stelle= $mitte+1;
echo "<p>$cd_suche an Position $stelle gefunden. Na endlich!</p>";
break;
}
if($cd[$mitte] < $cd_suche)
$links = $mitte+1;
if($cd[$mitte] > $cd_suche)
$rechts = $mitte-1;
}
?>
</body>
</html>
Viele Grüße
Peter
$cd = file ( 'sammlung.txt' );
for ( $x = 0; $x < count ( $cd ); $x++ ){
sort($cd);
foreach ($cd as $x => $y) {
echo $cd[$x] . '<br>';
} }
Nehme mal an, dass das hier der relevante Text ist...
du schreibst die sammlung.txt in ein array, pro Zeile gehst du einmal durch die Schleife, in der Schleife sortierst du JEDESMAL dein array und startest eine neue Schleife, die FÜR JEDE Zeile der sammlung.txt einmal ausgeführt wird..?
sort brauchst du nur EIN MAL ausführen (vor der Schleife).
Was macht das foreach da? hast doch schon ein $x...
Vielen Dank, ich habe das mal umgeändert:
$cd = file ( 'sammlung.txt' );
sort($cd);
for ( $x = 0; $x < count ( $cd ); $x++ ){
echo $cd[$x] . '<br>';
}
das klappt auch weiterhin, aber leider funktioniert die Ausgabe der Suche (also die Anzeige der Position der CD immer noch nicht.
Viele Grüße
Peter
das klappt auch weiterhin, aber leider funktioniert die Ausgabe der Suche (also die Anzeige der Position der CD immer noch nicht.
Dann poste bitte den relevanten, nicht-funktionierenden Code (und sag am besten auch gleich dazu, was er wie erreichen soll). Ganze Seiten zu posten, die größtenteils unwichtig sind, sind hier eh nicht so gerne gesehen ;-)
Hallo,
also, der code soll erreichen, dass die "gesuchte CD" (nur wenn sie genau so eingeben ist wie in der Datenbank), die in einem formular eingetragen werden kann, am ende des scriptes mit der Position ausgegeben wird. Also die gesuchte CD ist auf Position x.
Ich denke dieser Code ist relevant:
$links = 0;
$rechts = count($cd)-1;
while ($links <= $rechts){
$mitte = floor(($links + $rechts)/2) ;
if ($cd[$mitte] == $cd_suche){
$stelle= $mitte+1;
echo "<p>$cd_suche an Position $stelle gefunden. Na endlich!</p>";
break;
}
if($cd[$mitte] < $cd_suche)
$links = $mitte+1;
if($cd[$mitte] > $cd_suche)
$rechts = $mitte-1;
}
Da dieser Code aber, wie schon geschrieben, ohne das sortieren und einfügen der externen datei (die als "Datenbank" benutzt wird) funktioniert, kann es genau so gut sein, dass der erste Teil relevant ist. Daher hatte ich bei meinem ersten Eintrag den kompletten Code gepostet, da ich nicht weiß, was wirklich relevant ist.
lg
Peter
mein Verständnisproblem setzt schon früher an:
du hast eine txt-Datei, wo in jeder Zeile ein CD-Name steht?
Du willst die Zeilennummer ausspucken, wo der Zeileninhalt mit dem Inhalt eines INPUT-Felds übereinstimmt, den ein User eingetragen hat?
Für was brauchst du dann eine berechnete Mitte??
Geh doch einfach die Zeilen durch und lass ein $i mitlaufen, welches bei Übereinstimmung ausgespuckt wird. Verstehe deine Vorgehensweise nicht..
$cd = file ( 'sammlung.txt' );
for ( $x = 0; $x < count ( $cd ); $x++ ){
if ($cd[$x] == $inputvalue) { echo $x; }
}
ja, das mit der txt-datei stimmt. in jeder zeile ist dort ein CD-Name.
Ein Sinn ist in diesem Script weniger, da ich dabei bin php zu lernen. Ich habe als Hausaufgabe aufbekommen eine binäre suche zu machen. Diese wurde in der Stunde besprochen und das Script wurde uns dann so ausgeteilt. Nun sollen wir noch ein paar Sachen dazumachen. Also eine externe Datei einfügen (die als Datenbank fugiert) und diese Datei soll man noch sortieren lassen.
Ein Sinn ist in diesem Script weniger, da ich dabei bin php zu lernen. Ich habe als Hausaufgabe aufbekommen eine binäre suche zu machen. Diese wurde in der Stunde besprochen und das Script wurde uns dann so ausgeteilt. Nun sollen wir noch ein paar Sachen dazumachen. Also eine externe Datei einfügen (die als Datenbank fugiert) und diese Datei soll man noch sortieren lassen.
also was spricht genau gegen meinen ebigen Vorschlag?
wenn ich das hier richtig mitbekommen habe, spricht gegen das script von dir, bert, nur, dass du eine lineare suche verwendest, aber es eine binäre suche sein soll.
neutraler
Hallo,
Ein Sinn ist in diesem Script weniger, da ich dabei bin php zu lernen. Ich habe als Hausaufgabe aufbekommen eine binäre suche zu machen. Diese wurde in der Stunde besprochen und das Script wurde uns dann so ausgeteilt.
in diesem speziellen Fall zieh ich meinen Vorschlag zurück. Es ist allerdings eine gute Idee, solche Bedingungen gleich zu Beginn zu erwähnen.
Freundliche Grüße
Vinzenz
Hello,
Für was brauchst du dann eine berechnete Mitte??
Sowas nennt sich "binäre Suche".
Die ist aber im Falle PHP hier unnötig, da PHP hierfür eigene Array-Funktionen bereit hält
Die Funktion array_keys() käne da in Frage:
http://de2.php.net/manual/en/function.array-keys.php
Das setzt aber auch voraus, dass ein genauer Vergleich stattfindet, bei dem leider auch die Groß-/Kleinschreibung relevbant ist und nicht abdingbar ist.
Für den Fall der ungefähren Suche müsste dann doch das ganze Array durchgeschaut werden, um die Treffer zu finden. Einen Zähler muss man dabei aber nicht mitlaufen lassen, wenn einen nur der Key interessiert.
~~~php
$_liste = file('dateinanme'); ## Datei einlesen
$_ergebnis = array(); ## leeres Array bereitstellen
foreach($_liste as $key=>$zeile) ## Liste durcharbeiten
{
if (stripos($zeile, $suchtext) === 0)) ## feststellen, ob $zeile mit $suchtext beginnt
{ ## case insensitive
$_ergebnis[$key] = $zeile; ## Bei Treffer in die Ergebnismenge aufnehmen
} ## Key beibehalten
}
echo "<pre>\r\n";
echo htmlspecialchars(print_r($_ergebnis,1));
echo "</pre>\r\n";
Eventuell könnte man in der Schleife $zeile und $suchtext noch vorher druch trim() jagen, um führenden und anhängende Leerzeichen zu beseitigen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg

--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Hallo,
ich habe eine CD-Suche mit php geschrieben, wobei eine "Datenbank" auf diese Cd durchsucht wird. Das hat geklappt, wenn ich die "Datenbank" mit einem array-Befehl aufgelistet habe. Jetzt wollte ich die "Datenbank" jedoch aus einer Textdatei einbinden und sortieren, sodass die "Datenbank" durchsucht wird.
abfrage_1.php
<html>
<body>
<form action="auswertung.php" method="post">Suche
<input type="text" name="cd_suche" />
<input type="submit" value="abschicken" /></body></html>auswertung.php
// Das Umkopieren ist überflüssig, verzichte darauf
> $cd = file ( 'sammlung.txt' );
// Wie bereits angemerkt, reicht ein einfaches Sortieren aus
> sort($cd);
> echo "<h2>Wo steckt die verfluchte ". $_POST['cd_suche'] ."-CD?</h2>";
// In einem Array wird etwas gesucht, es bietet sich in der Liste der
// [link:http://de2.php.net/manual/de/ref.array.php@title=Array-Funktionen] die Funktion [link:http://de2.php.net/manual/de/function.array-search.php@title=array_search()] an:
$position = array_search($_POST['cd_suche'], $cd);
// Wenn das Ergebnis [link:http://de2.php.net/manual/de/language.operators.comparison.php@title=identisch] mit dem boolschen Wert false ist
// wurde die CD nicht gefunden,
if ($position !== false) {
// Hurra, wir haben sie:
echo "Status 200: die angeforderte CD ", $_POST['cd_suche'], " wurde an Position $position gefunden.\n";
// Berücksichtige, dass Arrayindizes von 0 an gezählt werden.
// Vielleicht willst Du auf $position noch 1 draufaddieren.
}
else {
// Sag dem Benutzer, dass es die CD in der Liste nicht gab
echo "Status 404: die angeforderte CD wurde in der Datenbank nicht gefunden.\n";
}
Du musst das Rad nicht immer neu erfinden. Heutige Programmiersprachen und Frameworks bringen umfangreiche (Funktions- und Klassen-) Bibliotheken mit, die Du nutzen solltest.
Freundliche Grüße
Vinzenz