PHP-php如何高效操作大的数组

发布于 2016-11-20 19:58:41 字数 1245 浏览 1315 评论 4

目前有个视频列表一页大概显示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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

归属感 2017-10-03 23:59:25

我这里有一个12000行的数组,在php默认内存限制下,是不可能被写入内存中的怎样解决会好点?

灵芸 2017-05-16 16:47:18

时间估计是花在这段代码上了

 //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条视频信息,同属同一类型的内容的话。可以考虑将去取过滤词和去重的过程代码剥离出去, 并且放到在循环之前操作,然后再把处理好的过滤词传给每条结果。

夜无邪 2017-03-20 07:20:00

看了一下代码,大概分析了一下,感觉这几个地方可以优化

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的扩展就行过滤替换。

甜柠檬 2017-02-16 21:28:24

下面是我的测试结果。机子配置不用贴吧。

[root@CentOS5 tools]# php ttt.php
//总的个数
count:178943
//去重操作系统默认方法
array_unque:0.576323032379
2426
//用循环的方式去重
froeach:0.0756840705872
2426[root@CentOS5 tools]#

//去重后的个数 这里好多一样的。只是测试
2426

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文