Heim  >  Artikel  >  php教程  >  PHP 大数组循环问题

PHP 大数组循环问题

WBOY
WBOYOriginal
2016-06-13 10:18:151869Durchsuche

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

?>

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn