php专区

 首页 > php专区 > PHP应用 > php函数大全 > PHP 大数组循环问题

PHP 大数组循环问题

分享到:
【字体:
导读:
         [导读] 小妹刚刚改投PHP门下。领导叫我把这段代码的执行效率优化一下我现在知道的优化就是小循环外面,好像在这没啥用。请问各位大侠我该怎么优化ne ? 领导说放内存里什么的。基本就是2个大数组不停的循环算权重。

小妹刚刚改投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 ."rn";
			} else {
				$dumpStr .= $this->_aItems[$key] . "t匹配惟一记录号t". $value[0] ."rn";
			}
		};
		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');

?>
分享到:
PHP识别电脑还是手机访问网站
最近,客户要求网站要判断是手机访问还是电脑访问,然后显示不同的信息,所以就在网上找了,这个,不是原创,重在分享。
HTML5移动开发之路(1)——jqMobi中Side...
记得以前在做Native App的时候类似于人人网侧边滑动的效果非常的热,很多app仿照该效果进行开发,在jqMobi中也有类似的效果被称为Side Menu.下面我们来一步一步实现该效果。 首先新建一个html文件,引入jqMobi的框架,如下: 接下来再添加一个panel如下     接下来我们来添加一个在panel同级标签下 接下来...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……