Filterung + Auflistung

ph612

Grünschnabel
Ich habe eine Tabelle (tabelle). Diese Tabelle hat mehrere Felder (id, person, fruechte).
Es gibt mehrere Werte in 'fruechte', diese sind mit Komma getrennt. z.B.:
id
1
person
Peter
fruechte
Apfel,Banane,Birne
id
2
person
Paul
fruechte
Kirsche,Apfel,Banane
id
3
person
Robert
fruechte
Apfel,Pfirsich

Nun möchte ich eine Auflistung machen (10 Einträge in Liste), die sortiert ist nach der Frucht, die am meisten verwendet wurde. z.B.:
  • Apfel (3)
  • Banane (2)
  • Birne (1)
  • Kirsche (1)
  • Pfirsich (1)
  • ...


Wie kann ich das machen?
 
Mit str_word_count() und array_count_values

PHP:
<?php 
$data = array(
    array(  'id' => 1,
            'person' => 'Peter',
            'fruechte' => 'Apfel,Banane,Birne'),
    array(  'id' => 2,
            'person' => 'Paul',
            'fruechte' => 'Kirsche,Apfel,Banane'),
    array(  'id' => 3,
            'person' => 'Robert',
            'fruechte' => 'Apfel,Pfirsich ')
    );

//Liste der durchsuchenden Feldern
$searchFields = array('fruechte');
    
//für jede [key]=>[value] Kombination die Funktion countWords aufrufen
array_walk_recursive($data, 'countWords', $searchFields);

//Nach Häufigkeit absteigend sortieren
arsort($wordList);

//Liste Ausgeben
foreach($wordList as $word => $count) echo "{$word}: {$count}<br />";


/**
 * Callback Function um die Wörter in den Arrays zu zählen
 * @param $item
 * @param $key
 * @param $searchFields
 */
function countWords($item, $key, $searchFields){
    if(in_array($key, $searchFields)){
        //Die Wörter auflisten und zählen -> array([wort]=>anzahl)
        $thisWords = array_count_values(str_word_count($item, 1));
        //jeder Eintrag der gefundenen Wörter der wordList hinzufügen
        array_walk($thisWords, 'addToWordList');
    }    
}
   
/**
 * Wort der Wörterliste hinzufügen
 * @param $count
 * @param $word
 */
function addToWordList($count, $word){
    $GLOBALS['wordList'][$word] = $GLOBALS['wordList'][$word]+($count);
}    
?>
 
Hallo,

das einfachste wäre es, deine Tabelle den Datenbank Normalformen entsprechend zu modellieren.
Das heißt, du lagerst das Feld "fruechte" in eine extra Tabelle aus.

Bsp:
Code:
Person
----------
name: varchar


Fruechte
----------
bezeichnung: varchar


PersonFruechte:
---------
person: varchar (references Person.name)
frucht: varchar (references Fruechte.bezeichnung)

Dann kannst du dir mit der folgenden Query die Daten holen:
SQL:
SELECT COUNT(*), frucht FROM PersonFruechte GROUP BY frucht;


Die andere Variante, alles so zu lassen wie es ist, wäre um einiges aufwändiger. Du müsstest dir die Früchte holen, in eine Array aufteilen und dann die entsprechenden Variablen mit PHP hochzählen lassen. // Edit: so wie es yaslaw vorschlägt ;)


Gruß
BK
 
Zurück