当前位置:Home > PHP > PHP 大数组循环问题

PHP 大数组循环问题

发布时间:2013-12-10   浏览次数:2022

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

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

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

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

 

<?php
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT);

class weight {
	private $_aItems = array();
	private $_aTable = array();
	private $_aDict = array();
	private $_aMatchs = array();
	private $_aShow = array();
	function __construct() {
	}

	public function newItems($aItems){
		//添加新的检索内容
		if (!is_array($aItems))
			$aItems = (array)$aItems;
		$this->_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 = <<<EOT
========DUMP-FILE-{$timeExport}=========================
{$dumpStr}
EOT;
				fwrite($rFile, $sContent);
				fclose($rFile);
				break;
			default:
				return $this->_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');

?>