php英文單詞統(tǒng)計(jì)器
本文實(shí)例為大家分享了英文單詞統(tǒng)計(jì)器php 實(shí)現(xiàn),供大家參考,具體內(nèi)容如下
程序開(kāi)始運(yùn)行, 按"瀏覽"鈕選擇一個(gè)英文文檔, 再按"統(tǒng)計(jì) Statistics"鈕, 即可得到按字母順序列出的所有單詞,及其出現(xiàn)的次數(shù)
用于測(cè)試的數(shù)據(jù)文檔: data.txt
驅(qū)動(dòng)程序:word.php
output.php 和 StringTokenizer.php 是 要求在同一個(gè)文件夾中的程序
1. words_statistics_PHP.png

2. word.php
<html>
<style>
td{
background-color:#CF6;
width:100px;
margin:5px;
}
</style>
<body>
<?php
/**
* 程序開(kāi)始運(yùn)行, 按"瀏覽"鈕選擇一個(gè)英文文檔, 再按"統(tǒng)計(jì)"鈕,
* 即可得到按字母順序列出的所有單詞,及其出現(xiàn)的次數(shù)
*
* 作者: 許同春 author Tongchun Xu
* @開(kāi)源中國(guó) Open Source, Chna communiity
* 完成日期:2016年6月10日 completion date: 10 June, 2016
*/
require("StringTokenizer.php");
require("output.php");
if($_POST['submit']){
if ($_FILES["file"]["error"] > 0)
echo "Error: " . $_FILES["file"]["error"] . "<br />";
else {
$myfile = fopen($_FILES["file"]["tmp_name"], "r") or die("Unable to open file!");
$str = fread($myfile,filesize($_FILES["file"]["tmp_name"]));
$delim = "?\\,. /:!\"()\t\n\r\f%";
$st = new StringTokenizer($str, $delim);
echo '找到字符串: '.$st->countTokens();
$list=new LinkedList();
while ($st->hasMoreTokens()) {
$list->orderInsert($st->nextToken());
}
$list->words_count();
$list->traversal();
fclose($myfile);
}
}
?>
<h2>英文文檔單詞統(tǒng)計(jì) Statistics on English words </h2>
<p>程序開(kāi)始運(yùn)行, 按"瀏覽"鈕選擇一個(gè)英文文檔, 再按"統(tǒng)計(jì) Statistics"鈕,
即可得到按字母順序列出的所有單詞,及其出現(xiàn)的次數(shù) </p>
<form action="word.php" method="post"
enctype="multipart/form-data">
<label for="file">英文文檔名 File Name:</label>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="統(tǒng)計(jì) Statistics" />
</form>
</body>
</html>
3. output.php
<meta charset="utf-8" />
<?
/**
* The class LinkedList allows an application to store strings in
* alphabetical order by calling orderInsert().
* 此處定義的 LinkedList 類(lèi),可以調(diào)用它的 方法 orderInsert(),來(lái)以字母
* 大小的順序儲(chǔ)存 英文字符串。
* 同時(shí)記錄 英文單詞出現(xiàn)的次數(shù)
* 作者: 許同春 author Tongchun Xu
* @開(kāi)源中國(guó) Open Source, China communiity
* 完成日期:2016年6月10日 completion date: 10 June, 2016
*/
class Node{
public $data;
public $frequency;
public $next;
function __construct($data, $next = null, $frequency = 1){
$this->data = $data; //英文字符串
$this->next = $next; //指向后繼結(jié)點(diǎn)的指針
$this->frequency=$frequency; //英文字符串出現(xiàn)的次數(shù)
}
}
class LinkedList{
private $head; //單鏈表的頭結(jié)點(diǎn),不存儲(chǔ)數(shù)據(jù)
function __construct(){//單鏈表的構(gòu)造方法
//頭結(jié)點(diǎn)的數(shù)據(jù)為"傀儡", 不代表 任何數(shù)據(jù)
$this->head = new Node("dummy 傀儡");
$this->first = null;
}
function isEmpty(){
return ($this->head->next == null);
}
/* orderInsert($data) 方法,
* 按給定字符串 $data 的大小, 將其安插到適當(dāng)?shù)奈恢茫?
* 以保證單鏈表中字符串的存儲(chǔ),始終是有序的。
*/
function orderInsert($data){
$p = new Node($data);
if($this->isEmpty()){
$this->head->next = $p;
}
else {
$node= $this->find($data);
if(!$node){
$q = $this->head;
while($q->next != NULL && strcmp($data, $q->next->data)> 0 ){
$q = $q->next;
}
$p->next = $q->next;
$q->next = $p;
}else
$node->frequency++;
}
}
function insertLast($data){//將字符串插到單鏈表的尾部
$p = new Node($data);
if($this->isEmpty()){
$this->head->next = $p;
}
else{
$q = $this->head->next;
while($q->next != NULL)
$q = $q->next;
$q->next = $p;
}
}
function find($value){//查詢(xún)是否有給定的字符串
$q = $this->head->next;
while($q->next != null){
if(strcmp($q->data,$value)==0){
break;
}
$q = $q->next;
}
if ($q->data == $value)
return $q;
else
return null;
}
function traversal(){//遍歷單鏈表
if(!$this->isEmpty()){
$p=$this->head->next;
echo "輸出結(jié)果:<table><tr>";
echo "<td>".$p->data."<br>出現(xiàn)次數(shù):".$p->frequency."</td>";
$n=1;
while($p->next != null){
$p=$p->next;
echo "<td>".$p->data."<br>出現(xiàn)次數(shù):".$p->frequency."</td>";
$n++;
if ($n%11==0) echo "</tr><tr>";
}
echo "</tr></table>";
}else
echo "鏈表為空!";
}
function words_count(){
if($this->isEmpty())
echo "<br>沒(méi)有儲(chǔ)存字符串 <br>";
else{
$counter=0;
$p=$this->head->next;
while($p->next != null){
$p=$p->next;
$counter++;
};
echo "***共有單詞 ".$counter." 個(gè)***";
}
}}
?>
4. StringTokenizer.php
<?php
/**
* The string tokenizer class allows an application to break a string into tokens.
*
* @author Azeem Michael
* @example The following is one example of the use of the tokenizer. The code:
* <code>
* <?php
* $str = "this is:@\t\n a test!";
* $delim = " !@:'\t\n\0"; // remove these chars
* $st = new StringTokenizer($str, $delim);
* echo 'Total tokens: '.$st->countTokens().'<br/>';
* while ($st->hasMoreTokens()) {
* echo $st->nextToken() . '<br/>';
* }
* prints the following output:
* Total tokens: 4
* this
* is
* a
* test
* ?>
* </code>
*/
class StringTokenizer {
/** @var string
*/
private $string;
/** @var string
*/
private $token;
/** @var string
*/
private $delim;
/**
* Constructs a string tokenizer for the specified string.
* @param string $str String to tokenize
* @param string $delim The set of delimiters (the characters that separate tokens)
* specified at creation time, default to " \n\r\t\0"
*/
public function __construct($str, $delim=" \n\r\t\0") {
$this->string = $str;
$this->delim = $delim;
$this->token = strtok($str, $delim);
}
/**
* Destructor to prevent memory leaks
*/
public function __destruct() {
unset($this);
}
/**
* Calculates the number of times that this tokenizer's nextToken method can
* be called before it generates an exception
* @return int - number of tokens
*/
public function countTokens() {
$counter = 0;
while($this->hasMoreTokens()) {
$counter++;
$this->nextToken();
}
$this->token = strtok($this->string, $this->delim);
return $counter;
}
/**
* Tests if there are more tokens available from this tokenizer's string. It
* does not move the internal pointer in any way. To move the internal pointer
* to the next element call nextToken()
* @return boolean - true if has more tokens, false otherwise
*/
public function hasMoreTokens() {
return ($this->token !== false);
}
/**
* Returns the next token from this string tokenizer and advances the internal
* pointer by one.
* @return string - next element in the tokenized string
*/
public function nextToken() {
$hold = $this->token; //hold current pointer value
$this->token = strtok($this->delim); //increment pointer
return $hold; //return current pointer value
}
}
?>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- PHP統(tǒng)計(jì)數(shù)值數(shù)組中出現(xiàn)頻率最多的10個(gè)數(shù)字的方法
- PHP實(shí)現(xiàn)統(tǒng)計(jì)在線人數(shù)功能示例
- php版微信數(shù)據(jù)統(tǒng)計(jì)接口用法示例
- php簡(jiǎn)單統(tǒng)計(jì)中文個(gè)數(shù)的方法
- php使用文本統(tǒng)計(jì)訪問(wèn)量的方法
- PHP統(tǒng)計(jì)二維數(shù)組元素個(gè)數(shù)的方法
- 也談php網(wǎng)站在線人數(shù)統(tǒng)計(jì)
- php精確的統(tǒng)計(jì)在線人數(shù)的方法
- php中3種方法統(tǒng)計(jì)字符串中每種字符的個(gè)數(shù)并排序
- php計(jì)算數(shù)組不為空元素個(gè)數(shù)的方法
- php統(tǒng)計(jì)數(shù)組元素個(gè)數(shù)的方法
- 使用php統(tǒng)計(jì)字符串中中英文字符的個(gè)數(shù)
- PHP編程計(jì)算文件或數(shù)組中單詞出現(xiàn)頻率的方法
相關(guān)文章
在ThinkPHP6中使用mysql進(jìn)行分頁(yè)查詢(xún)的實(shí)現(xiàn)代碼
隨著互聯(lián)網(wǎng)的快速發(fā)展,web應(yīng)用程序的開(kāi)發(fā)也越來(lái)越復(fù)雜,而分頁(yè)查詢(xún)是web應(yīng)用程序中常見(jiàn)的功能之一,thinkphp6是一個(gè)web框架,可以幫助開(kāi)發(fā)人員快速開(kāi)發(fā)應(yīng)用程序,在本文中,我們將討論如何在thinkphp6中使用mysql進(jìn)行分頁(yè)查詢(xún),需要的朋友可以參考下2024-07-07
如何使用Casbin作為T(mén)hinkPHP的權(quán)限控制中間件
本文介紹了如何使用Casbin作為T(mén)hinkPHP的權(quán)限控制中間件,感興趣的同學(xué),可以參考下,理解其原理。2021-05-05
PHP創(chuàng)建簡(jiǎn)單RPC服務(wù)案例詳解
這篇文章主要介紹了PHP創(chuàng)建簡(jiǎn)單RPC服務(wù)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
php基于curl實(shí)現(xiàn)隨機(jī)ip地址抓取內(nèi)容的方法
這篇文章主要介紹了php基于curl實(shí)現(xiàn)隨機(jī)ip地址抓取內(nèi)容的方法,可生成隨機(jī)IP進(jìn)行訪問(wèn),涉及curl設(shè)置與使用技巧,需要的朋友可以參考下2016-10-10
PHP遞歸實(shí)現(xiàn)文件夾的復(fù)制、刪除、查看大小操作示例
這篇文章主要介紹了PHP遞歸實(shí)現(xiàn)文件夾的復(fù)制、刪除、查看大小操作,結(jié)合實(shí)例形式分析了php遞歸算法結(jié)合php常用文件夾操作函數(shù)實(shí)現(xiàn)文件夾的復(fù)制、刪除、查看等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08
《Head First 設(shè)計(jì)模式》代碼之PHP版(面向?qū)ο髮W(xué)習(xí))
《Head First 設(shè)計(jì)模式》是本不錯(cuò)的講解設(shè)計(jì)模式的書(shū),不像F4寫(xiě)的那么枯燥,應(yīng)該算是比較容易理解的好書(shū)。2010-06-06

