php英文单词统计器

本文实例为大家分享了英文单词统计器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
  }
}
?>

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

(0)

相关推荐

  • 使用php统计字符串中中英文字符的个数

    复制代码 代码如下: <?phpecho $str = "43fdf测试fdsfadaf43543543职工问防盗锁防盗锁5345gfdgd";preg_match_all("/[0-9]{1}/",$str,$arrNum);preg_match_all("/[a-zA-Z]{1}/",$str,$arrAl);preg_match_all("/([/x{4e00}-/x{9fa5}]){1}/u",$str,$arr

  • php版微信数据统计接口用法示例

    本文实例讲述了php版微信数据统计接口用法.分享给大家供大家参考,具体如下: php版微信数据统计接口其实是非常的好用了在前版本还没有此功能是后面的版本增加上去了,下面来看一个php版微信数据统计接口的例子: 微信在1月6日时放出了新的数据分析接口传送门: 请注意: 1.接口侧的公众号数据的数据库中仅存储了2014年12月1日之后的数据,将查询不到在此之前的日期,即使有查到,也是不可信的脏数据: 2.请开发者在调用接口获取数据后,将数据保存在自身数据库中,即加快下次用户的访问速度,也降低了微信侧

  • PHP实现统计在线人数功能示例

    本文实例讲述了PHP实现统计在线人数的方法.分享给大家供大家参考,具体如下: 我记得ASP里面统计在线人数用application 这个对象就可以了.PHP怎么设计? PHP对session对象的封装的很好,根据HTTP协议,每个范围网站的访客都可以生成一个唯一的标识符 echo session_id(); //6ed364143f076d136f404ed93c034201<br /> 这个就是统计在线人数的关键所在,只有有这个session_id 也就可以区分访问的人了.因为每一个人都不同

  • php简单统计中文个数的方法

    本文实例讲述了php简单统计中文个数的方法.分享给大家供大家参考,具体如下: 之前的公司是做外贸的用到的都是英文所以统计的长度的时候是用strlen这个函数,一直也没有错误,但是现在统计中文的时候这个就出错了,现在做一下记录测试 <?php echo strlen("你好ABC") . ""; # 输出 9 echo mb_strlen("你好ABC", 'UTF-8') . ""; # 输出 5 echo mb_str

  • 也谈php网站在线人数统计

    function checkOnline($userid,$tempid=null)      {      $conn = connect(); //对于所有用户      //先设置自己为在线      $stmt = "UPDATE ".DB_NAME.".USER SET IsOnline='Y' WHERE UserID=".$userid;      $result = query($stmt,$conn);      //info($stmt);   

  • php计算数组不为空元素个数的方法

    复制代码 代码如下: <?php $arr = array( 1=>"11", 2=>"22", 3=>"33", 4=>"" ); print_r(count(array_filter($arr))); ?>

  • php精确的统计在线人数的方法

    这是一个非常精确的,通过php实现统计在线人数的方法,想知道怎么实现的请耐心阅读. <?php $filename='online.txt';//数据文件 $cookiename='VGOTCN_OnLineCount';//cookie名称 $onlinetime=600;//在线有效时间,单位:秒 (即600等于10分钟) $online=file($filename); //PHP file() 函数把整个文件读入一个数组中.与 file_get_contents() 类似,不同的是 fi

  • php中3种方法统计字符串中每种字符的个数并排序

    复制代码 代码如下: <?php //这个方法纯粹是背函数,不解释: function countStr($str){ $str_array=str_split($str); $str_array=array_count_values($str_array); arsort($str_array); return $str_array; } //以下是例子: $str="asdfgfdas323344##$\$fdsdfg*$**$*$**$$443563536254fas";

  • PHP统计二维数组元素个数的方法

    解决思路1. 首先从数据库的congtent字段读取数据,并把它们合并成一个字符串. 复制代码 代码如下: <?php while($myrow = $connector -> fetch_array($result)) {  //$r[] = explode(",", $myrow["content"]);  $str .= $myrow["content"].','; } $arr_str = substr($str, 0, -1

  • PHP编程计算文件或数组中单词出现频率的方法

    本文实例讲述了PHP编程计算文件或数组中单词出现频率的方法.分享给大家供大家参考,具体如下: 如果是小文件,可以一次性读入到数组中,使用方便的数组计数函数进行词频统计(假设文件中内容都是空格隔开的单词): <?php $str = file_get_contents("/path/to/file.txt"); //get string from file preg_match_all("/\b(\w+[-]\w+)|(\w+)\b/",$str,$r); //

  • php使用文本统计访问量的方法

    本文实例讲述了php使用文本统计访问量的方法.分享给大家供大家参考,具体如下: 方法1: $fp = fopen("counter.txt", "r+"); while(!flock($fp, LOCK_EX)) { // acquire an exclusive lock // waiting to lock the file } $counter = intval(fread($fp, filesize("counter.txt"))); $

  • PHP统计数值数组中出现频率最多的10个数字的方法

    本文实例讲述了PHP统计数值数组中出现频率最多的10个数字的方法.分享给大家供大家参考.具体分析如下: 该问题属于TOPK范畴,统计单词出现频率,做报表,数据统计的时会常用! php代码如下: //随机生成数值数组 for($i=0;$i<1000;$i++){ $ary[]=rand(1,1000); } //统计数组中所有的值出现的次数 $ary=array_count_values($ary); arsort($ary);//倒序排序 $i=1; foreach($ary as $key=

  • php统计数组元素个数的方法

    count():对数组中的元素个数进行统计; sizeof():和count()具有同样的用途,这两个函数都可以返回数组元素个数.可以得到一个常规标量变量中的元素个数,如果传递给这个函数的数组是一个空数组,或者是一个没有经过设定的变量,返回的数组元素个数就是0; array_count_value():统计每个特定的值在数组$array中出现过的次数; 如: $array=array(4,5,1,2,3,1,2,1); $ac=array_count_value($array); 将创建一个名为

随机推荐