检查字符串是否包含数组的值之一


Check if string contain one of the value of an array

我有一个数组

$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'); 
        }
    }

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

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

$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),然后查看过滤后的数组是否有任何项目。

一个更简单的解决方案是

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

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

其他答案为$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()电话。

下面是运行三个不同输入案例的演示。

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