PHP开发之英语单词计数器的实现代码

来源:爱站网时间:2020-12-24编辑:网友分享
计数器一般是使用execl进行统计,但是有些人为了安全起见禁用了函数这个功能,接下来爱站技术频道小编一起来学习PHP开发之英语单词计数器的实现代码吧。

计数器一般是使用execl进行统计,但是有些人为了安全起见禁用了函数这个功能,接下来爱站技术频道小编一起来学习PHP开发之英语单词计数器的实现代码吧。

具体内容如下

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

2. word.php


 

0) echo "Error: " . $_FILES["file"]["error"] . "
"; 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); } } ?>

英文文档单词统计 Statistics on English words

程序开始运行, 按"浏览"钮选择一个英文文档, 再按"统计 Statistics"钮, 即可得到按字母顺序列出的所有单词,及其出现的次数

 

3. output.php


/**
 * 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 "输出结果:";
    echo "";
    $n=1;
    while($p->next != null){
      $p=$p->next;
      echo "";
      $n++;
      if ($n%11==0) echo "";
      }
       
      echo "
".$p->data."
出现次数:".$p->frequency."
".$p->data."
出现次数:".$p->frequency."
"; }else echo "链表为空!"; } function words_count(){ if($this->isEmpty()) echo "
没有储存字符串
"; else{ $counter=0; $p=$this->head->next; while($p->next != null){ $p=$p->next; $counter++; }; echo "***共有单词 ".$counter." 个***"; } }} ?>

4. StringTokenizer.php


 * countTokens().'
';
 * while ($st->hasMoreTokens()) {
 * echo $st->nextToken() . '
';
 * }
 * prints the following output:
 * Total tokens: 4
 * this
 * is
 * a
 * test
 * ?>
 * 
 */
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开发之英语单词计数器的实现代码,是不是觉得操作起来是很简单呢?当然了开发项目不是小事,希望我们通过本文的介绍对大家有所帮助。

上一篇:docker如何安排PHP开发环境

下一篇:PHP开发中程序运行过程的详细步骤

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载