Kurt: Anzahl "Wörter" in einem String zählen

Hallo,

ich möchte die Anzahl von "Wörtern" in einem String zählen. Meine Art zu zählen bedeutet aber:

Alle Zeichen sind erlaubt. Wörter werden durch ein Leezeichen voneinander getrennt.

Bau ich mir lieber mit explode und array_count selber eine Funktion oder kann man str_word_count dazu überreden?

Freundliche Grüße, Kurt

  1. ich möchte die Anzahl von "Wörtern" in einem String zählen. Meine Art zu zählen bedeutet aber:

    Alle Zeichen sind erlaubt. Wörter werden durch ein Leezeichen voneinander getrennt.

    Bau ich mir lieber mit explode und array_count selber eine Funktion oder kann man str_word_count dazu überreden?

    Wenn deine Defintion "Leerzeichen trennt Wörter" ist, dann kommst du mit str_word_count() nicht weit :)

    Zudem:
    "2011 ist schon vorbei."

    3 Worte oder doch 4?

    1. Wenn deine Defintion "Leerzeichen trennt Wörter" ist, dann kommst du mit str_word_count() nicht weit :)

      Dacht ich mir schon ;)

      Zudem:
      "2011 ist schon vorbei."

      3 Worte oder doch 4?

      4, aber das würde
      print_r(str_word_count("2011 ist schon vorbei.", 0, '1234567890'));
      auch wissen.

      Freundlichen Gruß, Kurt

      1. 4, aber das würde
        print_r(str_word_count("2011 ist schon vorbei.", 0, '1234567890'));
        auch wissen.

        Das schon - aber aus deiner Defintion geht nicht hervor, ob du die zerlegte Liste dann nochmal druchgehst um z.B. reine Zahlen als Worte auszunehmen.

        Was ist mit folgendem:

        "Heute hab' ich mir einen 2-Teiler gekauft"

        1. Hi,

          "Heute hab' ich mir einen 2-Teiler gekauft"

          SISO? Das Wort heißt doch Zweiteiler.

          Bis die Tage,
          Matti

          1. "Heute hab' ich mir einen 2-Teiler gekauft"

            SISO? Das Wort heißt doch Zweiteiler.

            Auch, ja.

            »»

            14-Teiler :p

            1. @@suit:

              nuqneH

              14-Teiler :p

              Ist das ein Teiler der 14? Also 1, 2, 7, 14?

              Qapla'

              --
              Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
              (Mark Twain)
              1. Hi,

                Ist das ein Teiler der 14? Also 1, 2, 7, 14?

                -1, -2, -7, -14 und nicht die rationalen, reellen oder komplexen Teiler vergessen!

                Bis die Tage,
                Matti

        2. "Heute hab' ich mir einen 2-Teiler gekauft"

          Wenn du damit einen Bikini meinst, schuldest du uns allen ein Foto :D.

          Gruß
          Neugieriger
          T-Rex

          1. "Heute hab' ich mir einen 2-Teiler gekauft"
            Wenn du damit einen Bikini meinst, schuldest du uns allen ein Foto :D.

            Es soll auch Bücher, Filme oder Spiele mit mehreren Teilen geben :D

          2. Wenn du damit einen Bikini meinst, schuldest du uns allen ein Foto :D.

            Die haben drei Teile: Strohhut, Sonnenbrille und Badeschlappen.

        3. Das schon - aber aus deiner Defintion geht nicht hervor, ob du die zerlegte Liste dann nochmal druchgehst um z.B. reine Zahlen als Worte auszunehmen.

          Doch, schon. Ausschließlich Leerzeichen trennen Wörter.

          "Heute hab' ich mir einen 2-Teiler gekauft"

          Deshalb gäbe

          print_r(str_word_count("Heute hab' ich mir einen 2-Teiler gekauft", 0, '1234567890'));

          auch definitionsgemäß 7 aus. Genau wie ich will.

          Aber irgendwie trau ich dieser Funktion nicht so recht, daher die Frage, ob ich das nicht besser oder sicherer über explode und array_count mache?

          Freundlichen Gruß, Kurt

          1. Hallo Kurt,

            Aber irgendwie trau ich dieser Funktion nicht so recht, daher die Frage, ob ich das nicht besser oder sicherer über explode und array_count mache?

            welche Kontrolle hast Du über die Zeichenketten, die Du der Funktion verfüttern willst?

            Beispiel:

            <?php
            header("Content-type: text/plain");
            $text = "Eins\tzwei\tdrei";

            $count = array();  
            $count['str\_word\_count'] = str\_word\_count($text, 0, "0123456989");  
            $count['explode'] = count(explode(' ', $text));  
              
            var\_dump($text);  
            var\_dump($count);  
            

            ?>

            liefert

            string(14) "Eins zwei drei"
            array(2) {
              ["str_word_count"]=>
              int(3)
              ["explode"]=>
              int(1)
            }

            als Ausgabe.

            Freundliche Grüße

            Vinzenz

            1. liefert

              string(14) "Eins zwei drei"
              array(2) {
                ["str_word_count"]=>
                int(3)
                ["explode"]=>
                int(1)
              }

              als Ausgabe.

              Hi Vinzenz,

              danke für den Hinweis, gibt es außer Tabs noch andere zu berücksichtigende Steuerzeichen, wenn definitiv klar ist, dass kein Zeilenumbruch existiert?

              Oder willst Du damit ausdrücken, dass str_word_count die bessere Alternative ist?

              Freundlichen Gruß, Kurt

              1. Hallo Kurt,

                danke für den Hinweis, gibt es außer Tabs noch andere zu berücksichtigende Steuerzeichen, wenn definitiv klar ist, dass kein Zeilenumbruch existiert?

                aha, Zeilenumbrüche können also nicht vorkommen :-)

                Oder willst Du damit ausdrücken, dass str_word_count die bessere Alternative ist?

                Nein. Nur, dass str_word_count und explode durchaus unterschiedliche Ergebnisse liefern können. Du musst Deine Aufgabe exakt definieren. Was betrachtest Du wirklich als Wortgrenze?

                Nächstes Beispiel (mit Kais Vorschlag):

                  
                <?php  
                	header("Content-type: text/plain");  
                	$text = "Eins  zwei  drei";  
                	  
                	$count = array();  
                	$count['str_word_count'] = str_word_count($text, 0, "0123456989");  
                	$count['explode']        = count(explode(' ', $text));	  
                	$count['substr_count']   = substr_count($text, ' ');  
                	  
                	var_dump($text);  
                	var_dump($count);  
                ?>
                

                Ausgabe:

                string(16) "Eins  zwei  drei"
                array(3) {
                  ["str_word_count"]=>
                  int(3)
                  ["explode"]=>
                  int(5)
                  ["substr_count"]=>
                  int(4)
                }

                zeigt, dass Du ganz bestimmt aufeinanderfolgende Worttrennzeichen auf ein einziges reduzieren wolltest :-)

                Freundliche Grüße

                Vinzenz

                1. zeigt, dass Du ganz bestimmt aufeinanderfolgende Worttrennzeichen auf ein einziges reduzieren wolltest :-)

                  »»

                  Hi Vinzenz,

                  ok, gehen wir das Ganze mit str_word_count an. Mein Ziel ist es, durch Leerzeichen getrennte Begriffe als Einzelbegriffe zu parsen. Hierbei sollen mit (ohne leerzeichen) vorangestelltem Minuszeichen versehene Begriffe später anders behandelt werden. (Suchmaschine)

                  Da Du mir schon ein paar zu bedenkende Dinge mitgegeben hast, frag ich mal.
                  Hab ich in folgendem Code etwas übersehen oder gehts effizienter?

                    
                  $text = "C&A        gut + böse          gut+böse        A - B        A-B        -ausschluß";  
                    
                  $text= preg_replace("/[^a-zA-Z0-9 ÜüÖöÄäß+&-]/","",$text);  
                    
                  $texte = str_word_count($text, 0, '1234567890');  
                  if ($texte > 1) {  
                  $texte = str_word_count($text, 1, '1234567890');  
                  }  
                    
                    
                    
                  foreach($texte as $einzeltext) {  
                  if (($einzeltext{0} == "-") && (isset($einzeltext{1}))) {  
                    echo ("----------> $einzeltext <br>");  
                  } elseif ($einzeltext == "-") {  
                  // schmeiß raus  
                  } else {  
                    echo ("$einzeltext <br>");  
                  }  
                  }  
                    
                  
                  

                  Freundlichen  Gruß, Kurt

                  1. $text= preg_replace("/[^a-zA-Z0-9 ÜüÖöÄäß+&-]/","",$text);

                    $texte = str_word_count($text, 0, '1234567890');
                    if ($texte > 1) {
                    $texte = str_word_count($text, 1, '1234567890');
                    }

                    Warum so kompliziert? Warum nicht einfach mit preg_split() an den Wunsch-Trennzeichen oder Whitespace-Zeichen (z.B. \s+) zerlegen oder mit preg_match() nur Wörter (z.B. \p{L}+ oder \w+) matchen?

                  2. ok, gehen wir das Ganze mit str_word_count an. Mein Ziel ist es, durch Leerzeichen getrennte Begriffe als Einzelbegriffe zu parsen. Hierbei sollen mit (ohne leerzeichen) vorangestelltem Minuszeichen versehene Begriffe später anders behandelt werden. (Suchmaschine)

                    Ich versuche gerade die Nuss zu knacken, wie ich hieraus meine Queries zusammenstricke ohne zuviel manuell neu schreiben zu müssen.

                    Bisher sehen die so aus:

                      
                    select spalte1, spalte2, ..., spalte25  
                    from tabelle  
                    where spalte1 LIKE "%$suchbegriff%" OR  
                    spalte2 LIKE "%$suchbegriff%" OR  
                    spalte3 LIKE "%$suchbegriff%" OR  
                    ...  
                    spalte25 LIKE \"%$suchbegriff%\"  
                    
                    

                    Ideen (keine fertigen Lösungen - nur Ideen), wie ich das "zeitfreundlich abarbeiten" kann sind willkommen. Es sind je Suchabfrage natürlich immer andere Spaltennamen.

                    Freundlichen Gruß, Kurt

                    1. Ich versuche gerade die Nuss zu knacken

                      Keiner ne Idee? Ok, trotzdem Danke für die Denkanstöße.

                      Freundlichen Gruß, Kurt

                      1. Ich versuche gerade die Nuss zu knacken

                        Keiner ne Idee? Ok, trotzdem Danke für die Denkanstöße.

                        So ein SQL-Statement ist gruselig - und du sagst auch in keinster weise was du vor hast :)

                        1. keinster Weise

                          keiner Weise :P

                          1. keinster Weise

                            keiner Weise :P

                            Ok, sag mir, wie ichs besser machen kann.

                            Tabelle:

                            ID
                            Name
                            Vorname
                            Strasse
                            PLZ
                            Ort
                            Tel
                            Fax
                            Bemerkungen

                            Ich möchte eine Ergebnissmenge mit den Spalten

                            Name
                            Vorname
                            Strasse
                            PLZ
                            Ort
                            Tel

                            in denen der/die Suchbegriffe in von mir benannten Spalten vorkommen (und zwar ausdrücklich %suchbegriff%), die vom User eingegeben werden.

                            Bisher ist meine Query

                            select Name, Vorname, Strasse, PLZ, Ort, Tel  
                            from tabelle  
                            where  
                            Name LIKE "%$suchbegriff%" OR  
                            Vorname LIKE "%$suchbegriff%" OR  
                            Strasse LIKE "%$suchbegriff%" OR  
                            PLZ LIKE "%$suchbegriff%" OR  
                            Ort LIKE "%$suchbegriff%" OR  
                            Tel LIKE "%$suchbegriff%" OR  
                            Fax LIKE \"%$suchbegriff%\"
                            
                            1. Was ist an der Query besser zu machen, um dieselbe Ergebnissmenge zu erhalten?

                            2. Diese Query ist ja nur für ein Wort korrekt. Für z.B. 2 Worte müsste sie ja wie folgt aussehen

                            select Name, Vorname, Strasse, PLZ, Ort, Tel
                            from tabelle
                            where
                            (Name LIKE "%$suchbegriff1%" AND Name LIKE "%$suchbegriff2%") OR
                            usw.

                            Da ich aber jede Menge dieser Suchanfragen für verschiedenen Tabellen habe und auch nicht weiß, wieviele Worte vom User eingegeben werden, suche ich nach einem Weg, mir quasi sowas wie ein Query-Template zu basteln, was sozusagen immer passt. Ansonsten muss ich natürlich in jede Query manuell rein und es per Hand umstricken.

                            Ist einigermaßen klar geworden, worauf ich hinaus will?

                            Freundliche grüße, Kurt

                            1. Ist einigermaßen klar geworden, worauf ich hinaus will?

                              Ja :)

                              was du machen könntest ist alle Felder zu "einem" zusammenfügen und dieses dann abzugleichen

                              z.B.

                              SELECT  
                                CONCAT('Name', '|', 'PLZ', '|', Ort) as riesenfeld  
                              FROM  
                                table  
                              WHERE  
                                Riesenfeld like '%suchbegriff%')  
                              
                              

                              Das hat den Vorteil, dass du bei mehreren suchbegriffen nicht in einem Christbaum an Operatoren ertrinkst.

                              Der Nachteil ist, dass das Verbindungszeichen (in diesem Fall Pipe) nicht im Suchbegriff vorkommen darf.

                              Das kannst du aber z.B. dadurch umgehen, dass du als Verbindungszeichenkette etwas nimmst, was entweder sehr unwahrscheinlich ist, dass es im Suchbegriff vorkommt (irgend ein Pictogramm z.B. ein Kasterl, eine Schachfigur oder sonstwas) oder indem du etwas verwendest, was du ohnehin vorher schon ausfilterst - z.B. ein doppeltes Leerzeichen (welches im Suchbegriff gegen ein einzelnes ersetzt wird).

                              1. SELECT

                                CONCAT('Name', '|', 'PLZ', '|', Ort) as riesenfeld
                                FROM
                                  table
                                WHERE
                                  Riesenfeld like '%suchbegriff%')

                                
                                >   
                                  
                                  
                                Coole Sache. Darüber habe ich noch nie nachgedacht. Heißt zwar, ich muß doch alle Queries ändern, aber das sieht doch sehr viel sauberer aus.  
                                  
                                  
                                
                                > Der Nachteil ist, dass das Verbindungszeichen (in diesem Fall Pipe) nicht im Suchbegriff vorkommen darf.  
                                >   
                                  
                                  
                                Kein Problem. Eine Pipe wird z.B. eh rausgefiltert. Ansonsten hätt ich ne Doppelpipe oder einen Deiner Vorschläge genommen.  
                                  
                                Ich muß mir das jetzt mal näher anschauen und hab dann sicher noch Fragen dazu.  
                                  
                                Erstmal danke für die Idee.  
                                  
                                Freundlichen Gruß, Kurt  
                                  
                                P.S:  
                                  
                                Wie sieht es um die Performance aus?  
                                  
                                Ist meine Ursprungsquery performanter oder Dein Vorschlag?
                                
                                1. Wie sieht es um die Performance aus?

                                  Ist meine Ursprungsquery performanter oder Dein Vorschlag?

                                  Kann ich dir nicht Sachen - probiers aus.

                                  Aber wenn du einen signifikanten Unterschied feststellst, kannst du auch versuchen deine Variante mit PHP zu erzeugen.

                              2. SELECT

                                CONCAT('Name', '|', 'PLZ', '|', Ort) as riesenfeld
                                FROM
                                  table
                                WHERE
                                  Riesenfeld like '%suchbegriff%')

                                
                                >   
                                  
                                Bedeutet die Verwendung von concat eigentlich, dass die Spalten der Ergebnissmenge identisch mit denen der Abfrage sein müssen?  
                                  
                                Also, was ich meine ist: Geht aus sowas:  
                                ~~~sql
                                  
                                SELECT Name, Vorname  
                                FROM tabelle  
                                WHERE  
                                Tel LIKE %suchbegriff% OR  
                                Fax LIKE %suchbegriff%
                                

                                mit concat?

                                Freundlichst, Kurt

                              3. SELECT

                                CONCAT('Name', '|', 'PLZ', '|', 'Ort') as riesenfeld
                                FROM
                                  table
                                WHERE
                                  riesenfeld like '%suchbegriff%')

                                
                                >   
                                  
                                Hm. #1054 - Unknown column 'riesenfeld' in 'where clause'  
                                  
                                Und:  
                                  
                                Bedeutet die Verwendung von concat eigentlich, dass die Spalten der Ergebnissmenge identisch mit denen der Abfrage sein müssen?  
                                  
                                Also, was ich meine ist: Geht aus sowas:  
                                  
                                ~~~sql
                                SELECT Name, Vorname  
                                FROM tabelle  
                                WHERE  
                                Tel LIKE %suchbegriff% OR  
                                Fax LIKE %suchbegriff%  
                                
                                

                                mit concat?

                                Freundlichst, Kurt

                                1. Ok, beide Fragen habe ich rausbekommen.

                                  Es geht mit

                                  select * from table
                                  where
                                  concat_ws('|', Name, Vorname, Tel, Fax) LIKE '%$suchbegriff%'";

                                  Freundlichst, Kurt

                                  1. Hi,

                                    Es geht mit

                                    select * from table
                                    where
                                    concat_ws('|', Name, Vorname, Tel, Fax) LIKE '%$suchbegriff%'";

                                    aber es nutzt mir relativ wenig, denn was ist mit 2 oder 3 Suchbegriffen?

                                    Nicht funktionieren tut nämlich

                                    select * from table  
                                    where  
                                    concat_ws('|', Name, Vorname, Tel, Fax) LIKE '%$suchbegriff1%' AND LIKE '%$suchbegriff2%'";
                                    

                                    MySql scheint wirklich nur Abfragen ala

                                    WHERE  
                                    concat_ws('|', Name, Vorname, Tel, Fax) LIKE '%$suchbegriff1%' AND  
                                    concat_ws('|', Name, Vorname, Tel, Fax) LIKE '%$suchbegriff2%'
                                    

                                    zu akzeptieren.

                                    Ist das so? Dann nutzt es mir aber relativ wenig, die Query umgestellt zu haben, denn ich dachte ja, ich könnte anstelle von '%$suchbegriff%' (aus der obigen funktionierenden Query) eine Variable einsetzen, die ich entsprechend per php mit den Suchbegriffen fülle.

                                    Weiß wer weiter?

                                    Freundlichst, Kurt

                                    1. Ist das so? Dann nutzt es mir aber relativ wenig, die Query umgestellt zu haben, denn ich dachte ja, ich könnte anstelle von '%$suchbegriff%' (aus der obigen funktionierenden Query) eine Variable einsetzen, die ich entsprechend per php mit den Suchbegriffen fülle.

                                      Zumindest sind die Verknüpfungen wesentlich einfacher lesbar :)

                                      1. Zumindest sind die Verknüpfungen wesentlich einfacher lesbar :)

                                        Tzz. Ich pack jetzt die zu durchsuchende Spalten in Arrays und bau Schleifen in die Queries ein.

                                        Freundlichst, Kurt

                                        1. Hi,

                                          ich hab nun die Wörter in einem Array $worte (wort1,wort2,wort3), habe die zu durchsuchenden Spalten in einem array $durchsuche_spalten (name,vorname,adresse).

                                          Meine Query wird so lauten

                                          ~~~sql    $sql= "select * from table
                                          where
                                          ".$suchquery." LIMIT 0,20";

                                            
                                          Nun bau ich mir die Query  
                                            
                                          ~~~php
                                            
                                          $suchquery = "concat_ws('|', ";  
                                          $suchquery .= implode (",", $durchsuche_spalten);  
                                          $suchquery .= ") LIKE '%$suchbegriff%'";  
                                          
                                          

                                          Funktioniert bestens mit einem Suchbegriff.

                                          Um jetzt zb. bei 2 oder mehr Suchbegriffen ebenfalls mit "implode" arbeiten zu können, würde ich gerne das array $worte durch implode mit einem "AND" verbinden, um dann sowas zu bekommen wie

                                          select * from table  
                                          where  
                                          concat_ws('|',  
                                          name,  
                                          vorname,  
                                          adresse) LIKE '%wort1%'  
                                          AND  
                                          concat_ws('|',  
                                          name,  
                                          vorname,  
                                          adresse) LIKE '%wort2%'  
                                          AND  
                                          concat_ws('|',  
                                          name,  
                                          vorname,  
                                          adresse) LIKE '%wort3%'
                                          

                                          Und da hakt es gerade. Geht das überhaupt?

                                          Freundlichst, Kurt

                                          1. Und da hakt es gerade. Geht das überhaupt?

                                            foreach ($worte as $suchbegriff) {  
                                              // das was du schon hast :)  
                                            }
                                            

                                            Die einfachst Lösung ist dann ein geschickt plaziertes 1=1

                                            SELECT  
                                              foo  
                                            FROM  
                                              bar  
                                            WHERE  
                                              1 = 1  
                                              AND CONCAT_WS( ... )  
                                              AND CONCAT_WS( ... )  
                                              AND CONCAT_WS( ... )  
                                              ...
                                            

                                            so kannst du vor jede deiner in PHP generierten Ausgaben ein AND setzen ohne zu prüfen ob du jetzt im 1. durchlauf deiner Wortliste bist oder nicht.

                                            1. Tach!

                                              Die einfachst Lösung ist dann ein geschickt plaziertes 1=1

                                              Ein einzelner Wert, der zu TRUE evaluiert, wäre auch ausreichend, also nur eine 1 beispielsweise.

                                              so kannst du vor jede deiner in PHP generierten Ausgaben ein AND setzen ohne zu prüfen ob du jetzt im 1. durchlauf deiner Wortliste bist oder nicht.

                                              Eine weitere Möglichkeit ist, alle Teilausdrücke in einem Array zu sammeln und dieses mit einem implode(' AND ', ...) zusammenzufügen. Dieses Prinzip kann man auch für Listen anwenden, bei denen kein Dummy-Eintrag werwendet werden kann.

                                              dedlfix.

  2. [latex]Mae  govannen![/latex]

    ich möchte die Anzahl von "Wörtern" in einem String zählen. Meine Art zu zählen bedeutet aber:

    Alle Zeichen sind erlaubt. Wörter werden durch ein Leezeichen voneinander getrennt.

    Bau ich mir lieber mit explode und array_count selber eine Funktion oder kann man str_word_count dazu überreden?

    Wenn du nur die Anzahl der Wörter brauchst und nur Leerzeichen als Trenner gelten sollen, kannst du die Anzahl Leerzeichen mit substr_count() ermitteln und diesen Wert um 1 erhöhen.  Wenn du ohnehin mit den einzelnen Wörtern weiterarbeiten mußt und ohnehin mit explode arbeitest, lohnt sich dieser zusätzliche Schritt nicht, du kannst den Wert dann auch einfach mit count() des erzeugten Arrays ermitteln.

    Stur lächeln und winken, Männer!
    Kai

    --
    It all began when I went on a tour, hoping to find some furniture
     Followed a sign saying "Beautiful Chest", led to a lady who showed me her best)
    SelfHTML-Forum-Stylesheet
    1. Wenn du nur die Anzahl der Wörter brauchst und nur Leerzeichen als Trenner gelten sollen, kannst du die Anzahl Leerzeichen mit substr_count() ermitteln und diesen Wert um 1 erhöhen.

      Hai Kai,

      klar. Aber, wie Du im zweiten (hier nicht zitierten) Satz korrekt vermutet hast, brauch ich die Wörter noch :-)

      Freundlichen Gruß, Kurt

  3. Hallo,

    ich möchte die Anzahl von "Wörtern" in einem String zählen. Meine Art zu zählen bedeutet aber:
    Alle Zeichen sind erlaubt. Wörter werden durch ein Leezeichen voneinander getrennt.
    Bau ich mir lieber mit explode und array_count selber eine Funktion oder kann man str_word_count dazu überreden?

    Na explode ist etwas doof weil das wieder sehr viel mehr Speicher braucht, so weit ich das verstanden habe macht explode nicht nur ein Array mit Pointern sondern speichert auch Kopien der Teilstrings zusätzlich im Speicher.

    Ich hab mal was gebastelt das auch sehr große Strings durchsuchen kann da es nur 3 zusätzliche Integer braucht um den String durchzulaufen und die Wörter zu zählen, somit kann der String fast so groß sein wie der Rest des zur Verfügung stehenden Speichers.

    Auch sollte es ziemlich schnell sein da es nur O(n) ist und den string nur einmal durchläuft. Ich hoffe nur dass $str[0] nur das macht das ich denke dass es macht und nicht irgendwie was magisches.

      
    <?php  
      
    function word_count($str)  
    {  
        if ($str == "")  
        {  
            return 0;  
        }  
      
        $words = 0;  
        $found_word = false;  
      
        for($i = 0; isset($str[$i]); $i++)  
        {  
            if ($str[$i] != " ")  
            {  
                if (!$found_word)  
                {  
                    $words++;  
                }  
                $found_word = true;  
            }  
            else  
            {  
                $found_word = false;  
            }  
        }  
      
        return $words;  
    }  
      
    echo word_count(" abc  de f g n ");  
      
    // => 5  
    
    

    Jeena

    1. Na explode ist etwas doof weil

      Danke für Deine Mühe. Ich geh die Sache jetzt aber mal mit str_word_count an.

      Freundlichen Gruß, Kurt

      1. Hello,

        Danke für Deine Mühe. Ich geh die Sache jetzt aber mal mit str_word_count an.

        unter http://selfhtml.bitworks.de/wordcount.php findest Du noch einen alten Lösungsansatz von mir...

        Vielleicht hilft Dir das weiter.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
      2. Hallo,

        Danke für Deine Mühe. Ich geh die Sache jetzt aber mal mit str_word_count an.

        Mir wurde in #selfhtml gerade zugeflüstert dass meine Variante nicht mit UTF-8 Strings funktioniert, str_word_count übrigens auch nicht. Hier mal ein Link zu einer Alternative: http://stackoverflow.com/questions/8109997/supporting-special-characters-with-str-word-count#answer-8110097

        Jeena

        1. Danke für Deine Mühe. Ich geh die Sache jetzt aber mal mit str_word_count an.
          Mir wurde in #selfhtml gerade zugeflüstert dass meine Variante nicht mit UTF-8 Strings funktioniert, str_word_count übrigens auch nicht. Hier mal ein Link zu einer Alternative: http://stackoverflow.com/questions/8109997/supporting-special-characters-with-str-word-count#answer-8110097

          Sag' ich ja

          1. Hallo,

            Sag' ich ja

            Die Methode verbraucht aber vieeel mehr Speicher und Rechenzyklen, ohne die UTF-8 Anmerkung ich als wichtigstes Argument für diese Methode erachte die du aber leider nicht angibst, wäre sie den anderen Methoden unterlegen.

            Jeena

            1. Hallo Jeena,

              Sag' ich ja
              Die Methode verbraucht aber vieeel mehr Speicher und Rechenzyklen, ohne die UTF-8 Anmerkung ich als wichtigstes Argument für diese Methode erachte die du aber leider nicht angibst, wäre sie den anderen Methoden unterlegen.

              bei den angegebenen Randbedingungen:

              a) die Wörter werden anschließend benötigt
              b) die Zeichenketten enthalten keinen Zeilenumbruch, sind also eher kurz

              stechen Deine Argumente meiner Meinung nach nicht.

              Freundliche Grüße

              Vinzenz

              1. Hallo,

                bei den angegebenen Randbedingungen:
                a) die Wörter werden anschließend benötigt
                b) die Zeichenketten enthalten keinen Zeilenumbruch, sind also eher kurz

                Hm, ok das habe ich nicht mitbekommen und fand wohl die Aufgabestellung wie im Orginalposting viel spannender ;)

                Jeena

            2. Hallo,

              Die Methode verbraucht aber vieeel mehr Speicher und Rechenzyklen, ohne die UTF-8 Anmerkung ich als wichtigstes Argument für diese Methode erachte die du aber leider nicht angibst, wäre sie den anderen Methoden unterlegen.

              Da muss ich mir doch jetzt glatt widersprechen, ich habe es mal mit 1MB langen strings probiert und die manuelle Methode brauchte durchschnittlich 9 mal so viel Zeit wie die preg_match_all funktion. Wie ich den Speicherverbrauch messen kann weiß ich jetzt grad noch nicht.

              Jeena

              1. Tach,

                Wie ich den Speicherverbrauch messen kann weiß ich jetzt grad noch nicht.

                memusg könnte helfen, wird wie time verwendet; bei schnell ablaufenden Dingen, muss man vielleicht noch die Sampling-Zeit reduzieren.

                mfg
                Woodfighter

            3. Sag' ich ja
              Die Methode verbraucht aber vieeel mehr Speicher und Rechenzyklen, ohne die UTF-8 Anmerkung ich als wichtigstes Argument für diese Methode erachte die du aber leider nicht angibst, wäre sie den anderen Methoden unterlegen.

              \p{L}+ funktioniert ohne Unicode-Properties sowieso nicht und ergibt ohne PCRE8-Kompatiblität (u-Modifier) nicht wirklich Sinn.

              Aber hättest du mal einen Blick in die PHP-Doku geworfen, da gibts sogar eine Fallback-Lösung in den Kommentaren :p

              Unicode character properties