V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
EXDestroyer
V2EX  ›  PHP

这段 php 代码如何优化?

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

    初学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
    jookr  
       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   ·   我们的愿景   ·   实用小工具   ·   2595 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:52 · PVG 12:52 · LAX 21:52 · JFK 00:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.