1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Vorkommende Strings in Array(s) zaehlen [PHP]

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von Zettt, 28.04.07.

  1. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Hallo ihr da,

    Ich schreibe ja derzeit meinen MASTER Lebenslauf. Neulich war ich bereits auf der Suche nach einer Moeglichkeit das ganze mir anzeigen zu lassen.
    http://www.apfeltalk.de/forum/master-lebenslauf-tag-t78078.html

    Das klappt auch ganz gut. Nun wuerde ich das Ding natuerlich gerne ein wenig weiter entwickeln. Zum Beispiel in der Art das mir ein PHP Skript die Anzahl der Tags durchzaehlt und ausgibt. Damit ich mir darstellen lassen kann wie oft ich welches Tag vergeben habe fuer meine Dokumente.

    Wie wuerdet ihr das machen?
    Der von mir verwendete Parser (siehe Link) gibt mir das alles als Array aus. Damit hab ich auch keine Probleme. Sortierung geht. Nur wie durchsuch ich jetzt alle moeglichen Tags und lasse mir immer wenn Inhalt A kommt diesen auslesen? :oops:
    Das ganze muss natuerlich dynamisch sein. Nicht dynamisch kann ich inzwischen auch ;)

    Danke wenn ihr mir helfen koennt.
     
  2. Hobbes_

    Hobbes_ Gast

    Wie bereits kurz per PN besprochen, gibt es die einfache Möglichkeit, per PHP alle Elemente des Arrays kurz durchzugehen und dann einen Counter bei Auffinden des Wortes zu erhöhen. Etwa analog zu
    Code:
    if(strpos($array_item, $flag_name) !== FALSE)
    {
      $counter+=1;
    }
    Etwas ähnliches hast du ja bereits selbst gemacht.

    Wenn gleich mehrere Tags parallel gezählt werden sollen, kann man auch in etwa folgendes verwenden:

    Code:
    $counter_array=array();
    foreach($Dein_array as $array_item)
    {
      $dummy_array=explode($Dein_Trennzeichen, $array_item);
      foreach($dummy_array as $dummy_item)
      {
        $counter_array[$dummy_item]+=1;
      }
    }
    Dabei wird $Dein_array (Ein Array auf einen String mit Flags) vorausgesetzt (Du definierst); auch wird $Dein_Trennzeichen vorausgesetzt (zB ein Leerzeichen). Du kannst dann erneut mit einer foreach() Schleife beispielsweise das $counter_array abklappern oder direkt mit $counter_array['irgendein_flag_name'] auf eine solche Zahl zugreifen...

    Zur Programmierung einer etwas eleganteren Methode braucht es mehr Informationen:
    • Wie gross wird die Datenbank erwartungsgemäss (je nachdem lohnt sich die Programmierung einer intelligenteren Methode, um letztlich Rechenzeit zu sparen)?
    • Wird die ganze Datenbank nur jeweils dynamisch in diesem Array generiert aus den XML Files. Oder gibt es im Hintergrund noch eine echte Datenbank (SQL)?
    • Wie oft werden die benötigten Zahlen benötigt, d.h. lohnt es sich, diese ebenso in einer Datenbankecke abzulegen und jeweils nur upzudaten - oder genügt es, wenn diese jeweils "rasch" (je nach Datenbankgrösse, siehe oben) generiert werden.
    • Wie sind die Tags organisiert: Einzelne Worte in einem String? Trennzeichen?
    • (...)

    Nur die Suche nach einem bestimmten Begriff wäre wie bereits erwähnt kein Problem array_search().

    Gruss
    psc

    Nebenbei: Dies ist mein 2^8 . Beitrag :)
     
    #2 Hobbes_, 29.04.07
    Zuletzt von einem Moderator bearbeitet: 29.04.07
  3. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Uff...heavy!!!

    Also ich habe gar kein Trennzeichen.
    Die XML ist so aufgebaut
    Code:
    <documents>
    	<document>
    		<year></year>
    		<author></author>
    		<documentname></documentname>
    		<tags>
    			<tag></tag>
    			<tag></tag>
    			<tag></tag>
    		</tags>
    	</document>
    </documents>
     
  4. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    "Wie würdet Ihr das machen" hast Du gefragt. Ich hätte es mit Perl gemacht. Dort gibt es die sogenannten Hashes (gibt es in PP sicher auch). Das sind assoziative Arrays, d.h. Array, die über Strings indiziert werden.

    Wenn ich da Vorkommmen von String Elementen zählen will, mache ich das so:
    Code:
    foreach $element (@array) {
      ++$zaehl{$element}
    }
    Allerdings, da es ja bei Dir ein XML Dokument ist, hätte ich XML::Twig verwendet. Dort wird ein geparstes Dokument als Baum geliefert und nicht als Array. Außerdem kann bereits während des Parsens alles mögliche veransteltet, z.B. gezählt werden.
     
  5. Hobbes_

    Hobbes_ Gast

    Ich weiss, dass das XML-File so aufgebaut ist. Du benutzt es jedoch nicht direkt, sondern lässt es wie im anderen Posting angegeben durch einen XML-Parser auswerten, der Dir die entsprechenden Arrays zurückgibt.

    Ich habe jetzt den von Dir benutzten Parser nicht gerade zur Hand und habe kein laufendes PHP zur Verfügung. Deshalb auch nur der abstrakte Vorschlag oben ;)

    Aber wie ich gesehen habe, sollte es schon eine Möglichkeit geben aus diesen Arrays, die der XML-Parser generiert auf die einzelnen TAGs zu kommen. Alternativ kannst Du die äusseren Schleifen auch umbauen, dass er passt...

    Probieren wir mal folgendes...
    Code:
    <?PHP
    
    include 'clsParseXML.php';
    
    $xmlparse = &new ParseXML;
    
    $xml = $xmlparse->GetXMLTree('lebenslauf.xml');
    sort($xml["DOCUMENTS"][0]["DOCUMENT"]);
    
    $counter_array=array();
    
    foreach($xml["DOCUMENTS"][0] as $key => $value)
    {
      for($i = 1; $i <= sizeof($value); $i++)
      {
        foreach($xml["DOCUMENTS"][0]["DOCUMENT"][$i]["TAGS"][0] as $key2 => $value2)
        {
          for($j = 1; $j <= sizeof($value2); $j++)
          {
            $counter_array[$xml["DOCUMENTS"][0]["DOCUMENT"][$i]["TAGS"][0]["TAG"][$j-1]["VALUE"]]+=1;
          }
        }
      }
    }
    
    arsort($counter_array, SORT_NUMERIC);
    
    echo "<table>";
    foreach($counter_array as $key => $value)
    {
      echo "<tr><td>".$key."</td><td>".$value."</td></tr>";
    }
    echo "</table>";
    
    ?>
    Du erkennst sicher die oben bereits erwähnten Schlüsselelemente. Es ist eine Kombination Deines und meines Codes. Du kannst das ganze auch direkt in den von Dir erwähnten Ausgabeblock integrieren...


    EDIT: Ergänzung Sortierfunktion im Code wie besprochen...
     
    #5 Hobbes_, 29.04.07
    Zuletzt von einem Moderator bearbeitet: 04.05.07

Diese Seite empfehlen