搜索精灵----总结

1、require,include,require_once,include_once的区别

require: 

处理文件的方式: 一般放在php文件的最上方,require进来的file1会成为这个文件的一部分,先解析file1,再解析文件     中的内容,

错误处理方式:    如果file1里面有错误,php文件中的程序也不能继续走下去,而且生成的错误是致命错误;

多次执行时:       不管在这个文件中多少次require这个file1,只会解析一次file1;

一般用在哪里:    一般用于静态文件或者本身不包含自身变量的文件等

include:

处理文件的方式: include进来的file1只是一个外部引入的文件

错误处理方式:    如果file1里面有错误,会生成警告,php文件中接下来的程序也能走下去

多次执行时:        每出现一次Include都会重新解析文件,如果是同一个文件并且了里面有定义变量的话就会造成变量      的重复定义

一般用在哪里:    一般用在循环语句或条件判断语句中比较多

require_once和include_once用法差不多,执行之前都会先检查一下之前有没有引入过这个文件,之前引入过就不再引入了


2、关于类

类的定义:类是具有相同属性和方法的对象的集合

对象:对象是把属性具体化,然后交给类处理,对象本身不包括方法,但是对象有一个指针指向类,这个类可以有方法


3、对类进行封装的时候,要注重其扩展性,封装性,独立性。

扩展性:即这个类能够适应较多的跟其属性相关的弹性需求,一旦有新的功能需要添加或修改,则不需要一次次修改类中的代码,不懂程序的人也能够修改相关的配置文件来达到目的;

封装性:这个类只需要让别人知道是干什么用的,传什么参数,得出什么结果,至于处理的过程,则由这个类封装,外部是无法知晓的,也无法轻易修改,保证其安全性;

独立性:这个类需要具有独立性,即把它放在任何一个地方,都能够实现它所定义的功能,不依赖于某个必须的文件或库。


4、自定义函数的功能可以多,但是最好是同一个属性的,比如写入、读取、执行是三种不同的属性。一个函数内最好不要同时定义多个属性的功能,这样属性和功能一多其他使用者会混乱,而且需要更改某个属性的功能时不方便,可能造成函数体过于庞大,反而失去了函数轻巧、灵活的特质。


附:DataMatch.class.php     数据搜索精灵    ( 在扩展性和封装性方面显然还是不够的)

<?php 
include './function/function.php';

$sysconfig = include('./config/config.php');//配置文件
c($sysconfig);//c函数,用于获取配置中的内容

class DataMatch{

	protected $resource_arr;//数据源,数组格式   具体格式要求见data.php
	public $input_str;//待匹配数据,字符串
	protected $priority;//优先级  一维数组  默认空数组时不按优先级匹配
	protected $num;//一共需要匹配多少条数据
	protected $error_info;//错误信息

<span style="white-space:pre">	</span>//搜索
	public function search(){
		if(!empty($this->priority)){//如果有传入优先级,那么使用处理优先级的方法
			$retain_pos = $this-> arr_preg_priority();
		}else{
			$retain_pos = $this->arr_preg_normal();
		}
		$result_arr = $this->arr_sort($retain_pos,$this->resource_arr,$this->num);//筛选初级匹配的数组
		return $result_arr;//返回匹配的结果
	}

/**
 * [getData 接收输入的数组并判断数组格式是否正确]
 * @param  [type] $data [输入的数组]
 * @return [type]       [description]
 */
	public function setData($data,$str,$num){
		//判断数据格式是否符合要求
		foreach($data as $v){
			if(!is_array($v) || count($v)!=4 ){
				$this->error_info = '传入的数组格式不正确';
				return false;
			}
		}
		if(!is_string($str)){
			$this->error_info = '传入的待匹配值格式不正确';
			return false;
		}
		$this->resource_arr = $data;
		$this->input_str = $str;
		$this->num = $num;
	}

/**
 * [getPriority 接收输入的优先级并判断优先级是否正确]
 * @param  [type] $priority [description]
 * @return [type]           [description]
 */
	public function setPriority($priority){
		 if(!is_array($priority) || empty($priority)){
		 	$this->error_info = '传入的优先级格式不正确或为空';
		 	return false;
		 }
		 $this->priority = $priority;
		 return $this->priority;
	}

/**
 * [arr_preg 正常匹配函数--得到初级匹配值]
 * @param  [type] $arr      [数据源]
 * @param  [type] $input    [待匹配的值]
 * @param  [type] $priority [优先级]
 * @return [type]           [description]
 */
	protected function arr_preg_normal(){
		$preg = '/'.$this->input_str.'/i';
		$retain_pos = array();
		foreach($this->resource_arr as $key => $v){
			foreach($v as $value){
				if(preg_match($preg,$value)){
					$preg_pos = stripos($value,$this->input_str);
					if($retain_pos[$preg_pos]['sum']<$this->num && $retain_pos[0]['sum']<$this->num){//如果同一个位置且第0位匹配到的数超过需要展示的数,那这个位置的数就不再匹配
						$retain_pos[$preg_pos]['sum'] += 1; //将匹配到同一个位置的次数记录下来
						$retain_pos[$preg_pos]['key'][] = $key;   //记录下匹配到的键名 
					}
				}
				break;//这条数据匹配到了就不再匹配了
			}
		}
		return $retain_pos;
		
	}


/**
 * [arr_preg_priority 优先级匹配函数---得到初级匹配值]
 * @return [type] [description]
 */
	protected function arr_preg_priority(){
		$preg = '/'.$this->input_str.'/i';
		$retain_pos = array();

		foreach($this->priority as $value){
			foreach($this->resource_arr as $key => $v){
				if(preg_match($preg,$v[$value])){
					$preg_pos = stripos($v[$value],$this->input_str);
					if($retain_pos[$preg_pos]['sum']<$this->num && $retain_pos[0]['sum']<$this->num){//如果同一个位置且第0位匹配到的数超过需要展示的数,那这个位置的数就不再匹配
						$retain_pos[$preg_pos]['sum'] += 1; //将匹配到同一个位置的次数记录下来
						$retain_pos[$preg_pos]['key'][] = $key;   //记录下匹配到的键名 
					}
				}
			}
			if(count($retain_pos)>=$this->num){//如果这一个优先级的数据已经匹配完成,那么不再继续匹配下一个优先级的
				break;
			}
		}
		return $retain_pos;
	}


/**
 * [arr_sort 筛选数组,返回$num个匹配完成的最优结果]
 * @param  [type] $retain_pos   [初级匹配结果]
 * @param  [type] $resource_arr [数据源]
 * @param  [type] $number       [需要匹配的个数]
 * @return [type]               [description]
 */
	public function arr_sort($retain_pos,$resource_arr,$number){
		$compare=array_keys($retain_pos);//得到$retain_pos中所有的键值
		asort($compare);//对键值进行排序
		$count = end($compare);//取出最大的那一个
		$output_arr = array();
		for($i=0;$i<=$count;$i++){	
			if(isset($retain_pos[$i])){//如果位置$i有匹配到的次数
				for($j=0;$j<$retain_pos[$i]['sum'];$j++){//按照匹配到的次数进行for循环
					$num = $retain_pos[$i]['key'][$j];//取出每一次对应的数据的键名
					$output_arr[] = $resource_arr[$num];//从原始$arr中获取键名对应的键值,压入$array_result中
					if(count($output_arr)>$number-1){//如果匹配超过$num个,那就退出循环,因为拿来展示的数已经足够
						break 2;
					}
				}		
			}
		}
		return $output_arr;

	}

}


$obj = new DataMatch();

$data = include(c('search_file'));

$str = $_GET['name'];

if(!empty($str)){
	$obj->setData($data,$str,c('show_num'));

	$obj->setPriority(c('priority'));

	$result  = $obj->search();

}else{
	echo '传入的待匹配值为空';
}



// echo '<pre>';
// print_r($result);


 ?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值