这段 php 代码如何优化? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
EXDestroyer
V2EX    PHP

这段 php 代码如何优化?

  •  
  •   EXDestroyer 2015-03-02 18:02:40 +08:00 4549 次点击
    这是一个创建于 3877 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学php不久,一道题目,个人的做法是吧这些标题分别存到不同的数组,然后针对不同的数组进行循环遍历分别+=. 不过别人说这样还不如原来的,所以想请教下正确的方法是什么

    $xcount=0; $pos = strpos($newtitle, ''); if($pos) $xcount+=3; $pos = strpos($newtitle, '卖肾'); if($pos) $xcount+=3; $pos = strpos($newtitle, '收肾'); if($pos) $xcount+=3; $pos = strpos($newtitle, '24小时'); if($pos) $xcount+=3;//24小时 $pos = strpos($newtitle, '咨询热线'); if($pos) $xcount+=3;//24小时 $pos = strpos($newtitle, '找小姐'); if($pos) $xcount+=6;//24小时 $pos = strpos($newtitle, '服务信息'); if($pos) $xcount+=6;//24小时 $pos = strpos($newtitle, '学生妹'); if($pos) $xcount+=6;//24小时 $pos = strpos($newtitle, '找小姐'); if($pos) $xcount+=6;//24小时 

    //

    $pos = strpos($newtitle, '男女公关'); if($pos) { echo 'Fail, No Uid.';exit;} $pos = strpos($newtitle, '女公关'); if($pos) { echo 'Fail, No Uid.';exit;} $pos = strpos($newtitle, '男公关'); if($pos) { echo 'Fail, No Uid.';exit;} $pos = strpos($newtitle, '公关'); if($pos) { echo 'Fail, No Uid.';exit;} $pos = strpos($newtitle, '招聘'); 
    24 条回复    2015-03-03 12:14:56 +08:00
    nigelvon
        1
    nigelvon  
       2015-03-02 18:07:19 +08:00
    循环遍历为啥不如原来的,同样的代码重复N遍很爽么。
    lijinma
        2
    lijinma  
       2015-03-02 18:09:46 +08:00
    原题目是啥?
    EXDestroyer
        3
    EXDestroyer  
    OP
       2015-03-02 18:10:29 +08:00
    @nigelvon 对方的说法是,逻辑上没有原来的好,看上去不好维护
    我是把+=+,+=3,以及fail的三部分分开存到三个数组,对他们分别进行遍历
    EXDestroyer
        4
    EXDestroyer  
    OP
       2015-03-02 18:11:24 +08:00
    @lijinma http://d1kt.cn/course/pluginfile.php?file=/5031/mod_assign/intro/ssw.php
    修改这段代码,使程序结构更漂亮更好维护一点
    invite
        5
    invite  
       2015-03-02 18:18:05 +08:00
    不是应该: {key:value} 么?
    raincious
        6
    raincious  
       2015-03-02 18:25:34 +08:00
    能将原题贴上来么?

    这代码写的不好。不知道你什么意图,如果是搜索字符串是否存在,那么if($pos)这样的用法就是错的。
    branchzero
        7
    branchzero  
       2015-03-02 18:30:10 +08:00
    猜测应该是违禁词屏蔽?
    <?php
    $words = ['','关键词太多了自己后面接着加'];
    foreach($words as $word){
    if(strpos($newtitle, $word)) exit('Fail, No Uid.');
    }
    ?>
    搞定
    Moker
        8
    Moker  
       2015-03-02 18:32:36 +08:00
    话说那些关键词 没人注意到么
    jswh
        9
    jswh  
       2015-03-02 18:35:28 +08:00
    如果我写的话估计是这样子的

    $cOnfig= [
    'xCountPlus3' => [],
    'xCountPlus6' => [],
    'NoUidAndExit' => [],
    ];
    $xCount = 0;
    foreach($config as $action => $keywords) {
    foreach($keywords as $word) {
    if(strpos($newTitle, $word) !== false) {
    $action($xCount);
    }
    }
    }
    function xCountPlus3(&$xCount) {
    $xCount += 3;
    }
    function xCountPlus6(&$xCount) {

    }
    ...
    b821025551b
        10
    b821025551b  
       2015-03-02 18:36:20 +08:00
    7L正解
    hwiiago
        11
    hwiiago  
       2015-03-02 18:37:41 +08:00
    $sensitiveWords = array('' => 3, '卖肾' => 3, '收肾' => 3, '找小姐' => 6);
    $xcount = 0;
    foreach($sensitiveWords as $key => $value)
    {
    if (strpos($newtitle, $key) !== false)
    {
    $xcount += $value;
    }
    }
    zhujinliang
        12
    zhujinliang  
       2015-03-02 18:40:03 +08:00
    我的话会用正则搞,让正则处理器自己去优化
    jk2r
        13
    jk2r  
       2015-03-02 18:47:40 +08:00
    和敏感词过滤类似呀。

    你需要一个“多模式匹配”的PHP实现(AC状态机/Double-array Trie树),查出有的词;
    然后k-v查分数吧
    qqjt
        14
    qqjt  
       2015-03-02 19:03:55 +08:00
    只有我好奇这个是用在哪里的么,又是找小姐又是学生妹……
    EXDestroyer
        15
    EXDestroyer  
    OP
       2015-03-02 19:06:07 +08:00 via Android
    @raincious 原题在4楼了
    msg7086
        16
    msg7086  
       2015-03-02 19:48:08 +08:00 via iPhone
    if pos 什么鬼
    br00k
        17
    br00k  
       2015-03-02 20:55:04 +08:00
    是我应该会这样吧,感觉这种还是用数组方便,就是title也是数组for嵌套,也比单纯if好,不然数组内容多了,会增加太多无用代码。

    $title = "xxx";
    $str = ["", "卖肾", "收肾", "24小时", "咨询热线", "找小姐", "服务信息"];
    foreach ($str as $value) {
    if (false !== strpos($title, $value)) {
    echo $value;
    exit;
    }
    }
    alex321
        18
    alex321  
       2015-03-02 21:23:22 +08:00
    $str = array('', '卖肾', '收肾', '24小时', '咨询热线', '找小姐', '服务信息','男女公关','男公关','女公关','公关','招聘');
    preg_match('('.implode($str, '|').')', $newtitle, $matches);
    return strlen(implode($matches, ''));
    Jaylee
        19
    Jaylee  
       2015-03-02 21:29:16 +08:00
    表驱动法
    jookr
        20
    jookr  
       2015-03-02 23:24:29 +08:00
    以前我弄个采集QQ空间的网站也用到这个违禁词遍历,出现则该页面不显示。
    IDC先拔线再QQ通知我整改,然后续费的时候不租给我了,网站没这么赚钱就关了。
    jookr
        21
       2015-03-02 23:32:33 +08:00
    @EXDestroyer 选课密码是什么?没密码看不了原题
    EXDestroyer
        22
    EXDestroyer  
    OP
       2015-03-03 11:31:23 +08:00
    http://pan.baidu.com/s/1gd1pcD9
    我传到百度网盘了,题干没别的,就是说如何优化这段程序
    viowan
        23
    viowan  
       2015-03-03 11:56:16 +08:00
    9楼正解吧 感觉。最开始的代码结构也长,缩进感觉也有问题。改成数组之后明朗多了。
    EXDestroyer
        24
    EXDestroyer  
    OP
       2015-03-03 12:14:56 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3484 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:40 PVG 12:40 LAX 21:40 JFK 00:40
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86