PHP-php如何高效操作大的数组
目前有个视频列表一页大概显示20条。
现在要把标题,标签经过过滤词检测
检测方法如下 将循环20次
/*
*@param $content 基本字符
* @param $search_sensitive data_admin 表 var字段的值
* @return 返回content包含的字符用红色显示
*/
public function setSensitive($content, $search_sensitive=array(), $ext=false) {
if(empty($search_sensitive)) {
return $content;
}
//db对象
$oadmin = $this->getObj('AdminBase');
$senStr = '';
//这里取出所有的过滤次 egg:a,g,c,h,d
foreach ($search_sensitive as $var) {
//这里有做memcache缓存
$s = $oadmin->getAdminDataByVar($var);
if(!empty($s)) {
$senStr .= $s;
$senStr .=',';
}
}
$senStr = trim($senStr, ',');
$senAry = explode(',', $senStr);
//这里变数组,数组将会很大
$senAry = array_unique($senAry);
$str = '';
$data = array();
foreach ($senAry as $keyword) {
if($ext) {
if(FALSE !==strpos($content, $keyword)) {
$str .= ',' . $keyword;
}
} else {
$content = str_replace($keyword, '<font color=red>' . $keyword .'</font>', $content);
}
}
if($ext) {
$data['content'] = $content;
$data['senStr'] = !empty($str) ? '<font color=red>' . trim($str, ',') .'</font>' : '';
return $data;
}
return $content;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我这里有一个12000行的数组,在php默认内存限制下,是不可能被写入内存中的怎样解决会好点?
时间估计是花在这段代码上了
//db对象
$oadmin = $this->getObj('AdminBase');
$senStr = '';
//这里取出所有的过滤次 egg:a,g,c,h,d
foreach ($search_sensitive as $var) {
//这里有做memcache缓存
$s = $oadmin->getAdminDataByVar($var);
if(!empty($s)) {
$senStr .= $s;
$senStr .=',';
}
}
$senStr = trim($senStr, ',');
$senAry = explode(',', $senStr);
//这里变数组,数组将会很大
$senAry = array_unique($senAry);
循环每次都要执行一次
$s = $oadmin->getAdminDataByVar($var)
读的过程,再做$senAry = array_unique($senAry)
去重操作吗?貌似这块可以做些改进
如果20条视频信息,同属同一类型的内容的话。可以考虑将去取过滤词和去重的过程代码剥离出去, 并且放到在循环之前操作,然后再把处理好的过滤词传给每条结果。
看了一下代码,大概分析了一下,感觉这几个地方可以优化
1.既然最终的操作在数据上,完全可以直接用数组进行关键字存储
$senAry = array();
//这里取出所有的过滤次 egg:a,g,c,h,d
foreach ($search_sensitive as $var) {
//这里有做memcache缓存
$s = $oadmin->getAdminDataByVar($var);
//$s的格式不清楚,如果是字符串,可以把它转换成数组,然后进行存储
if(!empty($s)) {
$senAry[] = $s;
}
}
2.str_replace($senAry,'<font color=red>' . $keyword .'</font>', $content);(可以把$ext为true的情况提出来操作)
str_replace函数的详细用法可以去看一下手册,它的参数是支持数组的,没有必要循环替换。
3.$s = $oadmin->getAdminDataByVar($var);这个关键字可以用别的方式存储,不一定要存储在数据库中。
4.如果关键字太多,建议改用C的扩展就行过滤替换。
下面是我的测试结果。机子配置不用贴吧。
[root@CentOS5 tools]# php ttt.php
//总的个数
count:178943
//去重操作系统默认方法
array_unque:0.576323032379
2426
//用循环的方式去重
froeach:0.0756840705872
2426[root@CentOS5 tools]#
//去重后的个数 这里好多一样的。只是测试
2426