Ciao, da quel che so, non mi pare esista nativamente una funzione unica per ottenere ciò che chiedi, a meno di non usare qualche eventuale libreria apposita per l'analisi su testi (suppongo ne esistano ma non saprei dirti di più). La questione può comunque essere risolta in svariati modi usando diverse funzioni. Comunque sia, col semplice PHP dovresti suddividere il procedimento in vari passaggi e quindi usare diverse funzioni per risolvere ciascun passaggio.
I passaggi potrebbero essere i seguenti:
- recuperare il testo
Bisogna capire cosa intendi per "che sia un file, un post dal form ecc.". Ti direi che a prescindere dall'origine da cui prelevi tale testo, dovrai arrivare necessariamente ad ottenere una stringa testuale, per cui partirei da questo punto. E' chiaro poi che il processo per recuperare tale dato può risultare differente da caso a caso, a seconda del contesto, che si voglia recuperarlo da un file piuttosto che da una pagina web o magari da un database, ecc.
Partirei quindi da un semplice:
Codice PHP:
$str = "siamo andati in montagna e il tempo era brutto ma più a valle il tempo era migliore. Ritorneremo quando sarà ancora migliore";
- non fare distinzione tra lettere minuscole e maiuscole
Non lo hai specificato ma credo che parole come "Ciao" e "ciao" dovranno essere considerate equivalenti e conteggiate quindi assieme. In termini tecnici si può dire che il procedimento deve essere "case insensitive". In tal caso potrebbe essere necessario uniformare i dati in entrata. Può essere sufficiente convertire il testo tutto in minuscolo, usando ad esempio la funzione strtolower().
- suddividere il testo in parole e conteggiare quante volte viene ripetuta ciascuna parola
In realtà, a livello logico, sarebbero due passaggi distinti che vedono l'uso di una funzione tipo explode() o preg_match_all() (come consigliato da Misterxxx) o ancora con altre funzioni simili, cosi da ottenere un array contenente tutte le parole della stringa; dopo di chè usare un qualche ciclo per eseguire il conteggio di ciascuna parola.
Tuttavia in questo caso il PHP ci viene in contro con la funzione array_count_values() che esegue entrambe i passaggi in uno solo (ottenere un array delle parole e conteggiarne la frequenza). Tale funzione infatti, partendo da una stringa, restituisce un array associativo in cui le parole trovate sono usate come chiavi (quindi come valori univoci), mentre il numero della frequenza è applicato come valore per ciascun elemento dell'array restituito.
- riordinare gli elementi in base alla loro frequenza
E' possibile usare la funzione arsort() per riordinare gli elementi dell'array in modo crescente secondo il loro valore. In questo caso
Qui un semplice esempio:
Codice PHP:
$str = "siamo andati in montagna e il tempo era brutto ma più a valle il tempo era migliore. Ritorneremo quando sarà ancora migliore";
$arr = str_word_count( strtolower( $str ), 1, 'àèéìòù' );
$out = array_count_values( $arr );
arsort( $out, 0 );
print_r( $out );
Il risultato sarà:
Codice PHP:
Array
(
[tempo] => 2
[il] => 2
[era] => 2
[migliore] => 2
[siamo] => 1
[a] => 1
[sarà] => 1
[quando] => 1
[ritorneremo] => 1
[valle] => 1
[ma] => 1
[più] => 1
[andati] => 1
[brutto] => 1
[e] => 1
[montagna] => 1
[in] => 1
[ancora] => 1
)
Vedi se può essere utilizzato per ciò che ti serve; poi, ripeto, è possibile risolvere in tanti altri modi.