• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Es regnet, ist neblig und kalt, alle sind krank und der Chef wird zunehmend cholerisch. Das Thema des Monats ist also folgerichtig --> Das Grau(en)
    Wir sind gespannt, war Euch dazu einfällt! Zum Wettbewerb --> Klick

Vorkommende Strings in Array(s) zaehlen [PHP]

Zettt

Doppelter Melonenapfel
Registriert
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.
 

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 :)
 
Zuletzt bearbeitet von einem Moderator:

Zettt

Doppelter Melonenapfel
Registriert
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>
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
"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.
 

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...
 
Zuletzt bearbeitet von einem Moderator: