【问题标题】:if (in_array(<title>, $SomeArray)) return trueif (in_array(<title>, $SomeArray)) 返回真
【发布时间】:2011-10-05 11:51:52
【问题描述】:

我的问题是它无法检测字符串中的每个单词。类似于过滤器或标签或类别或排序......

$title = "What iS YouR NAME?";

$english = Array( 'Name', 'Vacation' );

if(in_array(strtolower($title),$english)){
    $language = 'english';
} else if(in_array(strtolower($title),$france)){
    $language = 'france';
} else if(in_array(strtolower($title),$spanish)){
    $language = 'spanish';
} else if(in_array(strtolower($title),$chinese)){
    $language = 'chinese';
} else if(in_array(strtolower($title),$japanese)){
    $language = 'japanese';
} else {
    $language = null;
}

输出为空.. =/

【问题讨论】:

    标签: php arrays variables filter categories


    【解决方案1】:

    这里没有真正的问题...$title 中的字符串不在您正在测试的任何数组中,即使是小写。

    尝试对照字符串测试每个语言选项卡中的每个单词。

    $english = Array( 'Name', 'Vacation' );
    $languages = array('english'=>$english,
                       'france'=>$france,
                       'spanish'=>$spanish,
                       'chinese'=>$chinese,
                       'japenese'=>$japenese);
    
    while($line = mysql_fetch_assoc($result)) {
        $title = $line['title'];
        //$lower_title = strtolower($title); stristr() instead.
    
        $language_found = false;
    
        foreach($languages as $language_name=>$language) {
            idx = 0;
            while(($language_found === false) && idx < count($language)) {
                $word = $language[$idx];
                if(stristr($title, $word) !== false) {
                    $language_found = $language_name;
                }
                $idx++;
            }
        }
    
        // got language name or false...
    }
    

    当然,您也可以使用explode 打破字符串,并针对每种语言测试创建的数组中的每个单词。

    【讨论】:

    • 它可以工作但它给出了错误:Warning: strpos() [function.strpos]: Empty delimiter in /***.php on line 47
    • 你说得对,我不得不改用strstr();,我会编辑它。
    • 可能解释器不喜欢if(strstr($lower_title, $word),我会再次编辑if(strstr($lower_title, $word)) ;-)
    • 我想你有一个致命的......我认为 strstr 更适合那个工作,因为 strpos 返回的值可以是许多不同的类型。
    • 我试过删除“break;”继续直到 mySQL 的最后一行......然后这给了我同样的错误说“空分隔符”
    【解决方案2】:

    输出为null,因为字符串"what is your name?" 不在任何语言数组中。请注意,您不应该在代码中编写语言名称。

    相反,字典或语言数组(以字典或对象的形式)允许将来扩展并将数据与控制逻辑分开。

    【讨论】:

      【解决方案3】:

      有几个逻辑问题:

      第一个问题是您试图查看一个多词字符串是否在单个词的数组中。那总是找不到匹配的。您需要将$titleexplode 分开并循环遍历这些单词。

      即)$title_words = explode(' ', strtolower($title));

      foreach($title_words as $word){
        //check language
        //now you can use in_array and expect some matches
      }
      

      然而,这带来了第二个问题。如果一个词是多种语言的怎么办?

      第三个问题是在您的示例中,您已将搜索字符串转换为小写,但您的匹配数组中所有单词的首字母都大写。 即)
      $english = Array( 'Name', 'Vacation' ); 应该是
      $english = array( 'name', 'vacation' );

      如果你期望匹配

      【讨论】:

      • 我问是否可以在$title 中使用带有空白的爆炸?
      • 现在将尝试测试它.. 给我不到 5 分钟。
      • @user453089 是的,explode 的第一个参数是分隔符,用于在空格处分断字符串
      • 我尝试了很多 $title.. 其中一个 $title 是工作,而其他不是...
      猜你喜欢
      • 2013-08-13
      • 2014-01-08
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 2014-07-07
      • 1970-01-01
      相关资源
      最近更新 更多