Home >Backend Development >PHP Tutorial >PHP large array loop problem_PHP tutorial

PHP large array loop problem_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 17:17:351031browse

My little sister just switched to PHP. My boss asked me to optimize the execution efficiency of this code

The optimization I know now is outside the small loop, and it seems to be of no use here.

Dear heroes, how should I optimize ne? The leader said to put it in the memory or something.

Basically, it is two large arrays that continuously loop to calculate the weight.

<?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(&#39;|&#39;, &#39;,&#39;, $value);
			$value = explode(&#39;,&#39;, $value);
			return $value;
		};
		$this->_aDict = array_map($convert, $this->_aTable);
	}

	public function getMatchs() {
		//返回对照表
		return $this->_aMatchs;
	}

	public function getShow($sRule = &#39;debug&#39;) {
		/*返回格式化的结果集
		 * $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. &#39;,&#39;;
				}
				$dumpStr .= $this->_aItems[$key] . "\t匹配多个记录号\t". $valueStr ."\r\n";
			} else {
				$dumpStr .= $this->_aItems[$key] . "\t匹配惟一记录号\t". $value[0] ."\r\n";
			}
		};
		switch($sRule) {
			case &#39;debug&#39;:
				print_r($this->_aShow);
				break;
			case &#39;json&#39;:
				return json_encode($this->_aShow);
				break;
			case &#39;txt&#39;:
				$timeExport = date("Y/M/D h:i:s");
				$dumpStr = &#39;&#39;;
				$rFile = fopen(&#39;dump.txt&#39;, &#39;w&#39;);
				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][&#39;keyring&#39;][$iDictKey];
				}
			}
			if (!$this->_aMatchs[$iKey][&#39;keyring&#39;][$iDictKey]) {
				//没有匹配到内容
				$this->_aMatchs[$iKey][&#39;keyring&#39;][$iDictKey] = 0;
			}
			if ($iMax< $this->_aMatchs[$iKey][&#39;keyring&#39;][$iDictKey])
				$iMax = $this->_aMatchs[$iKey][&#39;keyring&#39;][$iDictKey];
			$this->_aMatchs[$iKey][&#39;index&#39;] = array(
				&#39;key&#39; => $iDictKey,
				&#39;count&#39; => $iMax
			);

		}
	}

	private function match2Show($iKey) {
		//将对照表转化为结果集
		$multiMatch = array();
		//echo "ikey =". $iKey.", ";
		foreach ($this->_aMatchs[$iKey][&#39;keyring&#39;] as $iMatchKey => $iVal) {
			if ($iVal< $this->_aMatchs[$iKey][&#39;index&#39;][&#39;count&#39;]) {
				//这个值比最大值小
				//echo "x";
				continue;
			} else {
				//这个值跟最大值相等,将结果累加到记录中
				//echo "y";
				$multiMatch[] = $iMatchKey;
			}
		}
		if (count($multiMatch)> 1)
			//多于一条记录匹配值相同
			$this->_aShow[$iKey] = $multiMatch;
		else
			//匹配值最大值唯一
			$this->_aShow[$iKey] = array($this->_aMatchs[$iKey][&#39;index&#39;][&#39;key&#39;]);
	}
}

$aItems = array(
	&#39;chinaisbig&#39;,
	&#39;whichisnot&#39;,
	.....
	上万条
	.....
	&#39;totalyrightforme&#39;,
);
$aTable = array(
	&#39;china,is|small&#39;,
	&#39;china,big|me&#39;,
	.....
	上千条
	.....
	&#39;china,is|big,wich|not,me&#39;,
);
$weight = new weight();
$weight->newItems($aItems);
$weight->newTable($aTable);

$weight->getShow(&#39;debug&#39;);

?>

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/625800.htmlTechArticleMy little sister just switched to PHP. My boss asked me to optimize the execution efficiency of this code. The optimization I know now is outside the small loop, and it seems to be of no use here. Dear heroes, what should I do...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn