Str_split -> Array und die Auswertung
Danteshell
- php
Hallo ihr,
eine Woche lang stöbere ich das Inet schon durch auf der Suche nach einer Lösung. Hoffentloch kann mir jemand helfen.
Folgendes:
Ich habe ein Wort "test" das schreibe ich ein Array.
$var = str_split($wort);
Es soll eine Suchfunktion mir sagen ob ein Buchstabe, den ich vorgebe in dem Array vorhanden ist und an welcher Stelle. Sollte der Buchstabe mehrmals vorkommen sollte dies auch angezeigt werden.
Mein eigene Lösung ging auf:
$gefunden = array_search($buchstabe , $var);
Folgende Probleme:
Ich suche einen Lösungsansatz (ohne Java) der Simpel aussieht, nur soweit vereinfacht ist das ein Laie ihn auch Logisch verstehen kann. Es würde mit auch helfen wenn man mich in die richtige Richtung schubst zu schauen.
Danke euch schon für die Info im vorraus.
PS. RTFM usw bitte von vornherein ausschliessen :D
echo $begrüßung;
Ich habe ein Wort "test" das schreibe ich ein Array.
$var = str_split($wort);
Es soll eine Suchfunktion mir sagen ob ein Buchstabe, den ich vorgebe in dem Array vorhanden ist und an welcher Stelle.
Das ginge auch mit strpos().
Sollte der Buchstabe mehrmals vorkommen sollte dies auch angezeigt werden.
Das nicht mehr. count_chars() zeigt nur die Anzahl, keine Positionen.
Ich suche einen Lösungsansatz (ohne Java) der Simpel aussieht, nur soweit vereinfacht ist das ein Laie ihn auch Logisch verstehen kann.
Java? Wie kommst du jetzt plötzlich darauf? Egal. Du hast ein Array mit Buchstaben. Du willst all die Elemente haben, die ein bestimmter Buchstabe sind. Dazu kannst du das Array filtern:
$all_x = array_filter($var, create_function('$letter', 'return $letter == "x";'));
oder ein zweites mit dem gesuchten Wert anlegen und die Schnittmenge davon bilden
$all_x = array_intersect($a, array("x"));
oder zu Fuß drüber laufen und die gesuchten Werte einzeln in ein Ergebnisarray eintragen.
PS. RTFM usw bitte von vornherein ausschliessen :D
Keiner wird dir hier das Handbuch vorlesen, aber darauf verweisen, damit du die Funktionsbeschreibungen selbst nachlesen kannst.
echo "$verabschiedung $name";
Hi,
ich Danke dir für den Lösungsansatz werde mich gleich daran machen ihn zu testen
Moin
PS. RTFM usw bitte von vornherein ausschliessen :D
Warum sollten wir nicht???? hier steht eindeutig, das nur der erste gefundene Schlüssel zurückgegeben wird.
array_keys() mit Angabe des Suchstrings ist deine Funktion.
In dem Ergebnissarray werden alle keys gespeichert die mit deinem Suchstring übereinstimmen und mit sizeof() kannst du die Anzahl bestimmten
Hättest du das Handbuch gelesen, hättest du auch die Verlinkung zur Funktion array_keys() gefunden.
Gruß Bobby
Warum sollten wir nicht???? hier steht eindeutig, das nur der erste gefundene Schlüssel zurückgegeben wird.
array_keys() mit Angabe des Suchstrings ist deine Funktion.
In dem Ergebnissarray werden alle keys gespeichert die mit deinem Suchstring übereinstimmen und mit sizeof() kannst du die Anzahl bestimmten
Hättest du das Handbuch gelesen, hättest du auch die Verlinkung zur Funktion array_keys() gefunden.
Hallo Bobby,
ich bin jede einzelne Funktion durchgegangen betreffend arrays, nur deren definition was sie können hat mich dazu gewogen sie nicht zu nehmen. zB. mit array_keys() sagt er mir zwar das mein gesuchter buchstabe mehrmals vorkommt, aber nicht an welcher position des arrays.
[0]t[1]e[2]s[3]t[4] -> gut kommt 2 mal vor aber wie bekomme ich raus das er mir sagt
found "t" in [0] and [4]
Gruss
G.
echo $begrüßung;
zB. mit array_keys() sagt er mir zwar das mein gesuchter buchstabe mehrmals vorkommt, aber nicht an welcher position des arrays.
Dann hast du wohl nur den zweiten Teil des Satzes
» In dem Ergebnissarray werden alle keys gespeichert die mit deinem Suchstring übereinstimmen und mit sizeof() kannst du die Anzahl bestimmten
gelesen.
[0]t[1]e[2]s[3]t[4] -> gut kommt 2 mal vor aber wie bekomme ich raus das er mir sagt
found "t" in [0] and [4]
Indem du das Ergebnis des array_keys()-Aufrufs auswertest und eine entsprechende Ausgabe erzeugst.
echo "$verabschiedung $name";
Hi Danteshell,
ich habe Dein Ziel jetzt folgendermaßen erreicht:
<?php
$wort="Trompetentanzlehrertaschentuch";
$array=str_split($wort);
$wortzahl=mb_strlen($wort,"utf-8");
$buchstabeklein="t";
$buchstabegross="T";
$count=0;
echo"Wir zählen jetzt, wie oft der Buchstabe '".$buchstabegross."' im Wort '".$wort."' vorkommt.<br /><br />";
for($i=0;$i<$wortzahl;$i++)
{
if($array[$i]==$buchstabeklein)
{
$count++;
echo"Ein kleines ".$buchstabeklein." befindet sich an Stelle ".($i+1)." des Wortes ".$wort.".<br />";
}
if($array[$i]==$buchstabegross)
{
$count++;
echo"Ein großes ".$buchstabegross." befindet sich an Stelle ".($i+1)." des Wortes ".$wort.".<br />";
}
}
echo"<br />Insgesamt wurde der Buchstabe '".$buchstabegross."' somit ".$count." mal gezählt.";
?>
Das Ergebnis habe ich Dir auch online gestellt.
Wenn jemend bei _meiner_ Lösung einen Fehler sieht oder das _so nicht_ machen würde, freue ich mich über Feedback und Verbesserungsvorschläge.
Mit lieben Grüßen aus Wien
Michi
Moin
m.E. viel zu umständlich:
Einfacher gehts:
$buchstabe="h";
$wort="Flughuhnbratshowmoderator";
$var = str_split($wort);
$gefunden=array_keys($var,$buchstabe);
echo "Buchstabe ".$buchstabe." wurde ".sizeof($gefunden)." x gefunden.<br/>";
if (sizeof($gefunden)!="0")
{
echo "Auf den Positionen:<br/>";
for ($x=0;$x<sizeof($gefunden);$x++)
{
echo ($gefunden[$x]+1)."<br/>";
}
}
Gruß Bobby
echo $begrüßung;
for ($x=0;$x<sizeof($gefunden);$x++)
{
echo ($gefunden[$x]+1)."<br/>";
}
Alternativen dazu wären foreach und, wenn es ohne Addition dafür aber von 0 an gezählt sein darf, implode().
Außerdem, wenn du mit echo mehrere Ausdrücke ausgeben willst, gib sie mit Komma getrennt an. Dann kann PHP die Ausdrücke gleich nach ihrer Berechnung ausgeben und muss nicht erst als Zwischenergebnis einen großen String draus bauen.
echo "$verabschiedung $name";
Hi dedlfix,
Außerdem, wenn du mit echo mehrere Ausdrücke ausgeben willst, gib sie mit Komma getrennt an. Dann kann PHP die Ausdrücke gleich nach ihrer Berechnung ausgeben und muss nicht erst als Zwischenergebnis einen großen String draus bauen.
kannst Du diesen Satz bitte genauer erläutern und mit einem "ist OK" und einem "ist BESSER" Codebeispiel posten?
Mit lieben Grüßen aus Wien
Michi
echo $begrüßung;
» Außerdem, wenn du mit echo mehrere Ausdrücke ausgeben willst, gib sie mit Komma getrennt an. Dann kann PHP die Ausdrücke gleich nach ihrer Berechnung ausgeben und muss nicht erst als Zwischenergebnis einen großen String draus bauen.
kannst Du diesen Satz bitte genauer erläutern und mit einem "ist OK" und einem "ist BESSER" Codebeispiel posten?
Bei
echo foo, bar;
wird zuerst foo ausgewertet und in den Ausgabestrom geschrieben, erledigt der Fall. Anschließend wird bar ausgewertet und in den Ausgabestrom geschrieben. Man hat damit genausoviel Tipparbeit wie bei
echo foo . bar;
doch hier muss zuerst foo ausgewertet werden, das Ergebnis wird zwischengespeichert. Dann wird bar ausgewertet, und mit dem Ergebnis von foo zu einem gemeinsamen String verbunden, der dann erst ausgegeben wird. Es muss also Speicher für foo, bar und foobar belegt werden, der erst am Ende wieder frei wird.
echo "$verabschiedung $name";
Hi dedlfix,
dnke für die Erklärung.
Bedeutet das, dass es _generell_ besser ist, bei einer Stringverkettung mit einem Beistrich als mit einem Punkt zu arbeiten?
Ich habe doch gelernt, dass man für Stringverkettungen den Punkt als "Verkettungsoperator" verwenden soll/muß.
Oder betrifft das von Dir genannte _nur_ echo-Ausgaben?
Mit lieben Grüßen aus Wien
Michi
echo $begrüßung;
Bedeutet das, dass es _generell_ besser ist, bei einer Stringverkettung mit einem Beistrich als mit einem Punkt zu arbeiten?
Nein, das Komma ist kein Operator für Stringbehandlung.
Ich habe doch gelernt, dass man für Stringverkettungen den Punkt als "Verkettungsoperator" verwenden soll/muß.
Ja, Stringverknüpfung geht unter PHP mit dem Punkt. Wenn du den String anschließend weiterverarbeiten willst, musst du so vorgehen.
Oder betrifft das von Dir genannte _nur_ echo-Ausgaben?
echo kann man mehrere Argumente auf den Weg geben, die durch Komma getrennt werden. Hier ist es, wie gesagt, nicht notwendig, erst einen großen String zu bauen, wenn man die Argumente einzeln ausgeben lassen kann.
echo "$verabschiedung $name";
Hi dedlfix,
Alles klar. Danke auch für die Beantwortung der utf-8 Frage im selben Thread!
Mit lieben Grüßen aus Wien
Michi
echo $begrüßung;
$array=str_split($wort);
$wortzahl=mb_strlen($wort,"utf-8");
Wenn du mit UTF-8 hantierst, solltest du das konsequent tun und nicht nur teilweise, denn so liefert dir die Lösung bei Nicht-ASCII-Zeichen kein gewünschtes Ergebnis.
Wenn jemend bei _meiner_ Lösung einen Fehler sieht oder das _so nicht_ machen würde, freue ich mich über Feedback und Verbesserungsvorschläge.
Effektivere Alternativen wurden schon genannt.
echo "$verabschiedung $name";
Hi dedlfix,
Wenn du mit UTF-8 hantierst, solltest du das konsequent tun und nicht nur teilweise, denn so liefert dir die Lösung bei Nicht-ASCII-Zeichen kein gewünschtes Ergebnis.
und wo habe ich da worauf vergessen?
Mit lieben Grüßen aus Wien
Michi
echo $begrüßung;
» Wenn du mit UTF-8 hantierst, solltest du das konsequent tun und nicht nur teilweise, denn so liefert dir die Lösung bei Nicht-ASCII-Zeichen kein gewünschtes Ergebnis.
und wo habe ich da worauf vergessen?
Du ermittelst die Stringlänge mit mb_strlen() und unter Berücksichtigung der Besonderheiten von UTF-8. Bei einem UTF-8-kodierten "Ärger" ergibt mb_strlen(), eine Länge von 5, für die normalen PHP-String-Funktionen hat es hingegen die Länge 6. Das betrifft auch den zeichenweisen Zugriff. 'Ärger'[0] ergibt nicht 'Ä' sondern das erste Byte der zwei Ä-Bytes, usw.
PHP wird erst ab Version 6 ohne das Hilfsmittel der mb-Funktionen mit UTF-8 richtig umgehen können.
echo "$verabschiedung $name";
Hi dedlfix,
PHP wird erst ab Version 6 ohne das Hilfsmittel der mb-Funktionen mit UTF-8 richtig umgehen können.
und was wäre dann der _momentan_ richtige Weg, um "Ärger" richtig zu zählen und die Positionen richtig festzustellen? Auf utf-8 verzichten? Oder kann/soll/muuß ich den zu untersuchenden String irgendwie in ANSI umwandeln - wenn ja, wie?
Mit lieben Grüßen aus Wien
Michi
echo $begrüßung;
» PHP wird erst ab Version 6 ohne das Hilfsmittel der mb-Funktionen mit UTF-8 richtig umgehen können.
und was wäre dann der _momentan_ richtige Weg, um "Ärger" richtig zu zählen und die Positionen richtig festzustellen? Auf utf-8 verzichten? Oder kann/soll/muuß ich den zu untersuchenden String irgendwie in ANSI umwandeln - wenn ja, wie?
Eine UTF-8-Zeichenfolge nach ISO-8859-1 umzukodieren kommt einem Verzicht auf UTF-8 gleich, da nur noch 255 von count(Unicode-Zeichen) Zeichen übrigbleiben.
Man kann versuchen, die Stringverarbeitung in ein System zu verlagern, das mit UTF-8 umgehen kann und PHP nur als Durchreicher zum Browser und wieder zurück zu verwenden. Beispielsweise kann man gleich beim Abfragen des DBMS passende Stringfunktionen anwenden. Oder man verwendet die Funktionen der Extension Multibyte String, ist damit aber im Funktionsumfang eingeschränkt (und deutlich langsamer sollen sie auch sein). Oder man steigt auf ein System um, das bereits mit UTF-8 umgehen kann, Python beispielsweise.
echo "$verabschiedung $name";
Hi Michi,
auch dir danke ich für den Lösungsansatz. Da ich 2 hab kann nix schiefgehen.
Gruss
G.