php英文单词统计器


Posted in PHP onJune 23, 2016

本文实例为大家分享了英文单词统计器php 实现,供大家参考,具体内容如下

程序开始运行, 按"浏览"钮选择一个英文文档, 再按"统计 Statistics"钮, 即可得到按字母顺序列出的所有单词,及其出现的次数
用于测试的数据文档: data.txt
驱动程序:word.php
output.php 和 StringTokenizer.php 是 要求在同一个文件夹中的程序
1. words_statistics_PHP.png   

php英文单词统计器

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
  }
}
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
什么是MVC,好东西啊
May 03 PHP
php下几个常用的去空、分组、调试数组函数
Feb 22 PHP
php中检查文件或目录是否存在的代码小结
Oct 22 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
避免Smarty与CSS语法冲突的方法
Mar 02 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
Jul 01 PHP
Yii2.0中的COOKIE和SESSION用法
Aug 12 PHP
AJAX的使用方法详解
Apr 29 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
Oct 15 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 PHP
php抽奖概率算法(刮刮卡,大转盘)
Apr 17 #PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 #PHP
[原创]php使用curl判断网页404(不存在)的方法
Jun 23 #PHP
PHP生成静态HTML文档实现代码
Jun 23 #PHP
PHP微信支付开发实例
Jun 22 #PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
Jun 22 #PHP
PHP树-不需要递归的实现方法
Jun 21 #PHP
You might like
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
说明的比较细的php 正则学习实例
2008/07/30 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
php将html转成wml的WAP标记语言实例
2015/07/08 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
js select常用操作控制代码
2010/03/16 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
用Mootools获得操作索引的两种方法分享
2011/12/12 Javascript
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
angular2使用简单介绍
2016/03/01 Javascript
基于 Node.js 实现前后端分离
2016/04/23 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
pycharm设置注释颜色的方法
2018/05/23 Python
Python正则表达式指南 推荐
2018/10/09 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
python将字母转化为数字实例方法
2019/10/04 Python
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
phpquery中文手册
2021/03/18 PHP
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
更夫岗位责任制
2014/02/11 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
房屋出售授权委托书
2014/10/12 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
小浪底导游词
2015/02/12 职场文书
导游词之西安骊山
2019/12/03 职场文书
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python