本文实例为大家分享了英文单词统计器php 实现,供大家参考,具体内容如下
程序开始运行, 按\"浏览\"钮选择一个英文文档, 再按\"统计 Statistics\"钮, 即可得到按字母顺序列出的所有单词,及其出现的次数
用于测试的数据文档: data.txt
驱动程序:word.php
output.php 和 StringTokenizer.php 是 要求在同一个文件夹中的程序
1. words_statistics_PHP.png
2. word.php
<html> <style> td{ background-color:#CF6; width:100px; margin:5px; } </style> <body> <?php /** * 程序开始运行, 按\"浏览\"钮选择一个英文文档, 再按\"统计\"钮, * 即可得到按字母顺序列出的所有单词,及其出现的次数 * * 作者: 许同春 author Tongchun Xu * @开源中国 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>英文文档单词统计 Statistics on English words </h2> <p>程序开始运行, 按\"浏览\"钮选择一个英文文档, 再按\"统计 Statistics\"钮, 即可得到按字母顺序列出的所有单词,及其出现的次数 </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=\"统计 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 类,可以调用它的 方法 orderInsert(),来以字母 * 大小的顺序储存 英文字符串。 * 同时记录 英文单词出现的次数 * 作者: 许同春 author Tongchun Xu * @开源中国 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; //指向后继结点的指针 $this->frequency=$frequency; //英文字符串出现的次数 } } class LinkedList{ private $head; //单链表的头结点,不存储数据 function __construct(){//单链表的构造方法 //头结点的数据为\"傀儡\", 不代表 任何数据 $this->head = new Node(\"dummy 傀儡\"); $this->first = null; } function isEmpty(){ return ($this->head->next == null); } /* orderInsert($data) 方法, * 按给定字符串 $data 的大小, 将其安插到适当的位置, * 以保证单链表中字符串的存储,始终是有序的。 */ 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){//查询是否有给定的字符串 $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 \"输出结果:<table><tr>\"; echo \"<td>\".$p->data.\"<br>出现次数:\".$p->frequency.\"</td>\"; $n=1; while($p->next != null){ $p=$p->next; echo \"<td>\".$p->data.\"<br>出现次数:\".$p->frequency.\"</td>\"; $n++; if ($n%11==0) echo \"</tr><tr>\"; } echo \"</tr></table>\"; }else echo \"链表为空!\"; } function words_count(){ if($this->isEmpty()) echo \"<br>没有储存字符串 <br>\"; else{ $counter=0; $p=$this->head->next; while($p->next != null){ $p=$p->next; $counter++; }; echo \"***共有单词 \".$counter.\" 个***\"; } }} ?>
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 } } ?>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持phpstudy。
本文地址:https://www.stayed.cn/item/14529
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我