【问题标题】:Check if string contain one of the value of an array检查字符串是否包含数组的值之一
【发布时间】:2016-06-07 01:26:41
【问题描述】:

我有一个数组

$device_name = ["Xperia Z Ultra", "Xbox One", "Withing", "Win 7", "Surface Pro 4", "Surface Book", "Surface 3", "Play Station 4", "One Plus 2", "Nokia Lumia", "No Img", "Nexus 6p", "Nest", "Moto X", "Mac Pro", "Mac Book", "Mac Book Air", "Lg G4", "Laptop", "Iphone 6", "Iphone 6 S", "Iphone 6 S Plus", "Iphone 6 Plus", "Iphone 5s", "Iphone 5", "Iphone 4", "Ipad", "Ipad Pro", "Hue", "Htc One M9", "Hp Laptop", "Galaxy S6", "Galaxy S6 Edge", "Galaxy S5", "Galaxy Note 5", "Galaxy Note 4", "Galaxy Note 3", "Galaxy Note 2", "Chromecast", "Chrome Book", "Blackberry Z30", "Blackberry Z10", "Blackberry Prev", "Blackberry Bold", "August", "Apple Watch", "Apple Tv", "Ap", "Androidtablet"]

我有一个字符串

$input = "John's Xperia Z Ultra"

我试过了

    //Check if containing '
    if (strpos($input, "'") !== false) {
        $pieces = explode(" ", $input); // explode into pieces
        $input = $pieces[1].' '.$pieces[2]; //link them back in

        if (in_array($input, $device_name)) {
            dd('True'); 
        }

    }

我不确定我现在所拥有的是否是实现我想要的结果的最佳方式。

我愿意接受任何建议或更好的方法。

【问题讨论】:

  • 请记住,我的 $input 包含其他字符串 - 例如 username's (John's)
  • 我对你的编码尝试有点困惑,你只想搜索输入值如果它前面有一个所有格名词吗?

标签: php arrays search substring


【解决方案1】:
$devices = ["Xperia Z Ultra", "Xbox One", "Withing", "Win 7", "Surface Pro 4", "Surface Book", "Surface 3", "Play Station 4", "One Plus 2", "Nokia Lumia", "No Img", "Nexus 6p", "Nest", "Moto X", "Mac Pro", "Mac Book", "Mac Book Air", "Lg G4", "Laptop", "Iphone 6", "Iphone 6 S", "Iphone 6 S Plus", "Iphone 6 Plus", "Iphone 5s", "Iphone 5", "Iphone 4", "Ipad", "Ipad Pro", "Hue", "Htc One M9", "Hp Laptop", "Galaxy S6", "Galaxy S6 Edge", "Galaxy S5", "Galaxy Note 5", "Galaxy Note 4", "Galaxy Note 3", "Galaxy Note 2", "Chromecast", "Chrome Book", "Blackberry Z30", "Blackberry Z10", "Blackberry Prev", "Blackberry Bold", "August", "Apple Watch", "Apple Tv", "Ap", "Androidtablet"];

$input = "John's Xperia Z Ultra";

$stringContainsDevice = count(array_filter($devices, function($device) use ($input) {
    return stripos($input, $device) !== false;
})) !== 0;

所以基本上你过滤数组中包含在字符串中的项目(我不区分大小写,但如果你想要区分大小写,只需将stripos 更改为strpos)然后查看过滤后的数组是否有任何项目。

【讨论】:

  • 我不断收到stripos(): needle is not a string or an integer 。请帮忙!
  • 那你的数组里还有什么?
【解决方案2】:

一个更简单的解决方案将是

 $contain = 0 ;
 foreach($device_name as $value){
     if(strpos($input, $value)) $contain = 1;
 }

如果输入包含数组的值之一,则包含为 1,否则为 0

【讨论】:

  • 不错。我喜欢。感谢您的简单!
【解决方案3】:

其他答案为$device_name array 的每次迭代调用一个函数。两者都没有提供提前退出选项 (break)。

相反,我将改进您的 in_array() 流程,并向您展示一种避免条件语句并且只会进行 3 次函数调用的单行代码。

$device_name = ["Xperia Z Ultra", "Xbox One", "Withing", "Win 7", "Surface Pro 4", "Surface Book", "Surface 3", "Play Station 4", "One Plus 2", "Nokia Lumia", "No Img", "Nexus 6p", "Nest", "Moto X", "Mac Pro", "Mac Book", "Mac Book Air", "Lg G4", "Laptop", "Iphone 6", "Iphone 6 S", "Iphone 6 S Plus", "Iphone 6 Plus", "Iphone 5s", "Iphone 5", "Iphone 4", "Ipad", "Ipad Pro", "Hue", "Htc One M9", "Hp Laptop", "Galaxy S6", "Galaxy S6 Edge", "Galaxy S5", "Galaxy Note 5", "Galaxy Note 4", "Galaxy Note 3", "Galaxy Note 2", "Chromecast", "Chrome Book", "Blackberry Z30", "Blackberry Z10", "Blackberry Prev", "Blackberry Bold", "August", "Apple Watch", "Apple Tv", "Ap", "Androidtablet"];

$input = "John's Xperia Z Ultra";

var_export(in_array(array_slice(explode("'s ",$input,2),-1)[0],$device_name));  // true

这是它的工作原理:

  • 首先,分解's(单引号,s,空格)上的字符串并将元素的数量限制为2。这意味着如果找到's,将有2个元素,如果没有,将是 1 个元素。
  • 其次,删除explode()生成的最后一个元素。 可以使用end() 完成,但不能在同一行中——您需要声明一个新变量来处理这些数据。 array_slice() 的第二个参数(-1)表示提取最后一个元素。
  • 第三次通过访问零索引元素拉取切片元素(转换为字符串)。 可以使用current() 完成,但同样,您需要声明一个新变量。
  • 最后,拨打您的in_array() 电话。

这是demo that runs three different input cases

附言你原来的方法很好,只需要限制explode()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 2012-05-06
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2017-01-18
    • 2022-06-30
    • 2015-02-28
    相关资源
    最近更新 更多