• 技术文章 >php教程 >php手册

    PHP 大数组循环问题

    2016-06-13 10:18:15原创1278

    小妹刚刚改投PHP门下。领导叫我把这段代码的执行效率优化一下

    我现在知道的优化就是小循环外面,好像在这没啥用。

    请问各位大侠我该怎么优化ne ? 领导说放内存里什么的。

    基本就是2个大数组不停的循环算权重。

    _aItems = $aItems;
    		$this->_aMatchs = array();
    		$this->_aShow = array();
    	}
    
    	public function newTable($aTable){
    		if (!is_array($aTable))
    			$aTable = (array)$aTable;
    		$this->_aTable = $aTable;
    		$this->generateDict();
    	}
    
    	private function generateDict() {
    		//将字典处理成数组形式
    		$convert = function($value) {
    			$value = str_replace('|', ',', $value);
    			$value = explode(',', $value);
    			return $value;
    		};
    		$this->_aDict = array_map($convert, $this->_aTable);
    	}
    
    	public function getMatchs() {
    		//返回对照表
    		return $this->_aMatchs;
    	}
    
    	public function getShow($sRule = 'debug') {
    		/*返回格式化的结果集
    		 * $sFormat: 指定输出格式
    		 */
    		if (empty($this->_aItems)||empty($this->_aTable))
    			//字典源文件不存在
    			return false;
    		if (empty($this->_aShow)) {
    			/*匹配表还没有生成,自动调用相应的命令生成*/
    			$this->loopTable();
    		}
    		$makeDumpStr = function($value, $key) use (&$dumpStr) {
    			//生成导出文件的文本
    			if (count($value) >1) {
    				foreach ($value as $valueOne) {
    					$valueStr .= $valueOne. ',';
    				}
    				$dumpStr .= $this->_aItems[$key] . "\t匹配多个记录号\t". $valueStr ."\r\n";
    			} else {
    				$dumpStr .= $this->_aItems[$key] . "\t匹配惟一记录号\t". $value[0] ."\r\n";
    			}
    		};
    		switch($sRule) {
    			case 'debug':
    				print_r($this->_aShow);
    				break;
    			case 'json':
    				return json_encode($this->_aShow);
    				break;
    			case 'txt':
    				$timeExport = date("Y/M/D h:i:s");
    				$dumpStr = '';
    				$rFile = fopen('dump.txt', 'w');
    				array_walk($this->_aShow, $makeDumpStr);
    				$sContent = <<_aShow;
    				break;
    		}
    	}
    
    	private function loopTable() {
    		//遍历
    		foreach ($this->_aItems as $iItemKey=> $sItemLine) {
    			$this->matchElement($iItemKey);
    			//print_r($this->_aMatchs);
    			$this->match2Show($iItemKey);
    			//print_r($this->_aShow);
    			//echo "-----------------";
    		}
    		//print_r($this->_aMatchs);
    		//print_r($this->_aShow);
    	}
    
    	private function matchElement($iKey) {
    		$iMax = 0;
    		foreach ($this->_aDict as $iDictKey => $aDictLine) {
    			foreach($aDictLine as $sDictElement) {
    				$str = $this->_aItems[$iKey];
    				if(strstr($str, $sDictElement)){
    					//匹配到一个元素,计数器+1
    					++$this->_aMatchs[$iKey]['keyring'][$iDictKey];
    				}
    			}
    			if (!$this->_aMatchs[$iKey]['keyring'][$iDictKey]) {
    				//没有匹配到内容
    				$this->_aMatchs[$iKey]['keyring'][$iDictKey] = 0;
    			}
    			if ($iMax< $this->_aMatchs[$iKey]['keyring'][$iDictKey])
    				$iMax = $this->_aMatchs[$iKey]['keyring'][$iDictKey];
    			$this->_aMatchs[$iKey]['index'] = array(
    				'key' => $iDictKey,
    				'count' => $iMax
    			);
    
    		}
    	}
    
    	private function match2Show($iKey) {
    		//将对照表转化为结果集
    		$multiMatch = array();
    		//echo "ikey =". $iKey.", ";
    		foreach ($this->_aMatchs[$iKey]['keyring'] as $iMatchKey => $iVal) {
    			if ($iVal< $this->_aMatchs[$iKey]['index']['count']) {
    				//这个值比最大值小
    				//echo "x";
    				continue;
    			} else {
    				//这个值跟最大值相等,将结果累加到记录中
    				//echo "y";
    				$multiMatch[] = $iMatchKey;
    			}
    		}
    		if (count($multiMatch)> 1)
    			//多于一条记录匹配值相同
    			$this->_aShow[$iKey] = $multiMatch;
    		else
    			//匹配值最大值唯一
    			$this->_aShow[$iKey] = array($this->_aMatchs[$iKey]['index']['key']);
    	}
    }
    
    $aItems = array(
    	'chinaisbig',
    	'whichisnot',
    	.....
    	上万条
    	.....
    	'totalyrightforme',
    );
    $aTable = array(
    	'china,is|small',
    	'china,big|me',
    	.....
    	上千条
    	.....
    	'china,is|big,wich|not,me',
    );
    $weight = new weight();
    $weight->newItems($aItems);
    $weight->newTable($aTable);
    
    $weight->getShow('debug');
    
    ?>

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:php中{}大括号是什么意思 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 探讨:php中在foreach中使用foreach ($arr as &amp;$value) 这种类型的解释• php 中文处理函数集合• 优化使用mysql存储session的php代码• 用PHP+MySql编写聊天室• 新手入门:初学动态网页PHP的18个例子
    1/1

    PHP中文网