Maison  >  Article  >  php教程  >  PHP 大数组循环问题

PHP 大数组循环问题

WBOY
WBOYoriginal
2016-06-13 10:18:151872parcourir

小妹刚刚改投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(&#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;);

?>

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn