php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 4 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 21-11-2010, 14:45
w4rheart
 Registrierter Benutzer
Links : Onlinestatus : w4rheart ist offline
Registriert seit: Oct 2010
Beiträge: 20
w4rheart befindet sich auf einem aufstrebenden Ast
Standard Anzahl bestimmter Wörter in einem String zählen

Hello again!

Ich möchte aus einem String der ungefähr so aussieht.:
Zitat:
Name1 | Name3 | Name2 | Name1 | Name1 | Name3 |
..die Anzahl jedes vorkommenden Wortes (Namex) zählen, und nach der Anzahl ordnen.
Als Ergebnis sollte dann so etwas heraus kommen:
[Name1][3]
[Name3][2]
[Name2][1]

Hoffentlich versteht ihr wie ich das meine.
Ich hab gesucht, und bin auf die function preg_match_all gestoßen.
Allerdings verstehe ich diese nicht so ganz, bzw. weiss nicht, wie ich das pattern, wonach gesucht werden soll, der function mitgebe, denn das ist ja je nach String anders (-> immer unterschiedliche Namen:NameX).

Wie soll ich da vorgehen?
Eine Idee war den string in substrings auf zu teilen, dann jedes mit ner for schleife zu durchlaufen und jedes neu vorkommende worte in einen Array zuschreiben, dabei die Anzahl immer +1 zurechnen, und am Ende noch einen Sortieralgorythmus auszuführen.
Das ist aber evtl. etwas aufwendig ^^

Deshalb frage ich, gibt es eine php function die dies bereits für mich erledigt, und wenn ja: wie genau muss ich die einsetzen?

Wäre sehr nett, wenn ihr mir weiterhelfen könntet:

MfG
Mit Zitat antworten
  #2 (permalink)  
Alt 21-11-2010, 15:08
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

PHP-Code:

$haystack 
'...'// der zu durchsuchende Text

// die Liste der zu suchenden Wörter
$words = array (
    
'word1''word2',
);

$stat = array (); // sammelt die Anzahl der Wörter

foreach ($words as $word) {
    
// bereite das zu suchende Wort als PCRE auf
    
$pcre sprintf('/%s/'preg_quote($word));
    
// Variante für Ignorieren von Groß-/Kleinschreibung
    //$pcre = sprintf('/%s/i', preg_quote($word));

    
$num preg_match_all($pcre$haystack$hits);
    
$stat[$word] = $num;
}

var_dump($stat); 
Nachteile: Eventuell überlappende Wörter werden so mehrfach gezählt (in deinem Fall wahrscheinlich kein Problem). Und preg_match_all() legt bei jedem Durchgang ein extra Array in $hits an, dass alle gefundenen Wörter enthält. Das kann unter Umständen viel Speicher verbrauchen.

*update*

Eine Wortliste lässt sich so erzeugen:

PHP-Code:
$filter 'word1 | word2 | word3';

$words preg_split('/\s+|\s+/'$filter); 
*noch'n Update*
Ich verweise gern darauf, dass man Lösungen mit preg_match() und seinen Verwandten meist unkomplizierter zwischen Groß-/Kleinschreibung-Ignorieren oder -Beachten umstellen kann. Aber hier geht das auch einfacher. Zumal mir beim ersten Durchlesen deines Posts entgangen ist, dass in deiner Aufgabenstellung "Wortliste" und "zu durchsuchender String" dasselbe sind. Deswegen hier noch eine Variante ohne preg_match_all():

PHP-Code:
// 'n Beispiel
$words =  'word1 | word2 | word3 | word1 | WORD2 | wORD2';

// callback für array_reduce()
function reduce_helper(& $a$i) {
    if (!
is_array($a)) {
        
$a = array ();
    }
    
// folgende Zeile auskommentieren,
    // wenn Grosz-/Kleinschreibung unterschieden werden soll
    
$i strtolower($i);

    if (!isset (
$a[$i])) {
        
$a[$i] = 1;
    }
    else {
        
$a[$i] += 1;
    }
    return 
$a;
}

$stats array_reduce(
    
preg_split('/\s+\|\s+/'$words),  // zerlegen
    
'reduce_helper'                    // zaehlen
);

arsort($stats);

var_dump($stats); 
Wieso gibt's eigentlich keine fertige "count_words"-Funktion in PHP? Die haben doch sonst für jeden Quark was fertiggebackenes ...

Ach so, str_word_count() zählt nicht, im doppelten Wortsinn: Wenn es ein Array zurückgeben soll, listet es nur die "Wörter" auf.

PHP-Code:
define('count_words_ignore_case'1);
define('count_words_utf8'2);
define('count_words_sort'4);

function 
count_words(
    
$haystack,
    
$mode /// 1: ignore case 0: case-aware 2: utf-8-mode 4: sort
) {
    
$mode = (int) $mode;
    
$pcre '/[\pL\pN]++/S' . ($mode 'i''') . ($mode 'u''');

    for (
        
$off 0$stats = array ();
        
preg_match($pcre$haystack$hitsPREG_OFFSET_CAPTURE$off);
        
$off $hits[0][1] + strlen($hits[0][0])
    ) {
        
$word $mode 2
            
? ($mode mb_strtolower($hits[0][0], 'UTF-8') : $hits[0][0])
            : (
$mode strtolower($hits[0][0]) : $hits[0][0]);

        if (!isset (
$stats[$word])) {
            
$stats[$word] = 1;
        }
        else {
            
$stats[$word] += 1;
        }
    }
    if (
$mode 4) {
        
arsort($stats);
    }
    return 
$stats;


Geändert von fireweasel (21-11-2010 um 21:32 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 21-11-2010, 15:45
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Wenn der Fall so simpel ist, wie dargestellt, könnte das hier reichen:
PHP-Code:
$words 'Name1 | Name3 | Name2 | Name1 | Name1 | Name3 | ';

function 
count_words($words){
    
$words explode(' | ',$words);
    
$counter = array();

    foreach(
$words as $word)
        if(isset(
$counter[$word]))
            
$counter[$word]++;
        else
            
$counter[$word] = 1;

    return 
$counter;

__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #4 (permalink)  
Alt 21-11-2010, 15:45
w4rheart
 Registrierter Benutzer
Links : Onlinestatus : w4rheart ist offline
Registriert seit: Oct 2010
Beiträge: 20
w4rheart befindet sich auf einem aufstrebenden Ast
Standard

hallo fireweasel,
danke für deine Antwort, die hat mir schon mal weitergeholfen

Allerdings hab ich noch das Problem, dass ich die Wörter die im haystack gesucht werden sollen, vorher nicht kenne!
Ich habe also einen String, in dem verschiedene Namen in unterschiedlicher Anzahl getrennt durch " | " vorkommen,
weiss aber vorher nicht welche das sein werden.
Das ist eigentlich mein Hauptproblem, wo ich nicht weiss wie ich das lösen soll.

Noch eine Frage:
Sortiert der Algorithmus auch das Ergebnis?

MfG
Mit Zitat antworten
  #5 (permalink)  
Alt 21-11-2010, 15:56
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Allerdings hab ich noch das Problem, dass ich die Wörter die im haystack gesucht werden sollen, vorher nicht kenne!
Ich habe also einen String, in dem verschiedene Namen in unterschiedlicher Anzahl getrennt durch " | " vorkommen,
weiss aber vorher nicht welche das sein werden.
Das ist eigentlich mein Hauptproblem, wo ich nicht weiss wie ich das lösen soll.
Das ist in meinem bereits enthalten. Jetzt noch mal hingucken.

Zitat:
Noch eine Frage:
Sortiert der Algorithmus auch das Ergebnis?
Offensichtlich nein! Woher hätten wir auch wissen sollen, wonach du es gerne sortiert haben möchtest. Selber mitdenken ist hier erlaubt!
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #6 (permalink)  
Alt 21-11-2010, 16:31
w4rheart
 Registrierter Benutzer
Links : Onlinestatus : w4rheart ist offline
Registriert seit: Oct 2010
Beiträge: 20
w4rheart befindet sich auf einem aufstrebenden Ast
Standard

ah tut mir leid, wir hatten eben gleichzeitig gepostet.

ja also dein Code (TobiaZ) funktioniert wunderbar, bis auf das sortieren, wie du schon meintest.

Ich möchte es nach der Anzahl der vorkommenden Wörter sortieren.
Beispiel: Name1 ist 1x vorhanden, Name2 10x und Name3 5x, dann sollte es so aus sehen:
[Name2][10]
[Name3][5]
[Name1][1]

Wie sortiere ich denn einen Array nach der 2. Spalte?
sort und usort funktionieren hierbei irgendwie nicht =(

MfG
Mit Zitat antworten
  #7 (permalink)  
Alt 21-11-2010, 17:34
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
[Name2][10]
[Name3][5]
[Name1][1]
Was soll das sein???

Aber vermutlich suchst du arsort.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!

Geändert von TobiaZ (21-11-2010 um 17:37 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 21-11-2010, 17:52
w4rheart
 Registrierter Benutzer
Links : Onlinestatus : w4rheart ist offline
Registriert seit: Oct 2010
Beiträge: 20
w4rheart befindet sich auf einem aufstrebenden Ast
Standard

^ich wusste nicht genau wie ich es erklären sollte, aber arsort funktioniert, danke schön!
Mit Zitat antworten
  #9 (permalink)  
Alt 21-11-2010, 17:54
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Naja, vielleicht mit einem gültigen Array-Dump? So sah es eher nach einem multidimensionalen Array aus...
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #10 (permalink)  
Alt 21-11-2010, 18:19
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

substr_count()
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Anzahl bestimmter Zeichen im String ermitteln salim_aliya PHP Developer Forum 6 07-08-2008 15:13
Bestimme Wörter aus einem Text zählen Julia1999 PHP Developer Forum 5 16-10-2006 21:19
Anzahl eines Zeichens in einem String zählen chroman PHP Developer Forum 11 06-09-2006 00:17
Anzahl <selects> in einem Form zählen? Skaschy PHP Developer Forum 1 04-10-2004 00:59
mehrere Wörter gleichzeitig aus einem String entfernen Thommy PHP Developer Forum 5 02-06-2002 08:16

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 02:58 Uhr.