【问题标题】:Check if any array value contains a string - strpos检查任何数组值是否包含字符串 - strpos
【发布时间】:2013-11-12 00:57:14
【问题描述】:

为了检查字符串中是否存在子字符串:

if (strpos($haystack,$needle)!==false) {...}

但需要检查任何数组值是否包含字符串。

例如:检查“oran”是否包含在 $arr 的任何值中

$arr=array('orange1','orange2','orange3')

总是可以使用 strpos 进行 foreach 和分析每个数组值。

但是有没有优雅又不错的选择呢?

【问题讨论】:

  • 没有内置函数可以执行此 AFAIK。 foreach 循环可能是最好的。您可以使用array_filter(),但使用foreach,您可以在第一次匹配时停止,而不是检查每个元素。
  • 试试 preg_grep,一个较早的帖子在stackoverflow.com/questions/8627334/…有示例

标签: php


【解决方案1】:

这个怎么样?

if(strpos(implode(' ', $arr), 'oran') !== false){...}

您需要空格分隔符,以免意外:

$arr = array('for', 'antlr');  // implode would make 'forantlr', which contains 'oran'

【讨论】:

  • 对于一个不存在的问题似乎是一个可怕的“解决方案”。只需使用一个循环。
  • @Supericy 解释为什么这很可怕。此外,op 表示他知道如何使用循环,并且正在寻找替代方法。就是这样。更重要的是,这很可能比使用循环更快。
  • 这会比仅仅使用循环更快吗?您正在构建一个庞大的字符串(使您使用的内存量增加一倍),这无论如何都需要遍历整个数组。你确实回答了这个问题(即使现在你不能在针头上使用空格),所以也许我的评论应该是关于这个问题而不是你的答案。
  • 使用循环,您可以在匹配时中断,而使用您的代码,您必须一直读取整个数组
  • 不好的例子,但是如果你的$needle 是“abc, 123;”呢?现在您需要将分隔符更改为不在针中的内容。但是循环应该更有效,因为您可以在找到匹配项时停止(而不是构建(可能很大)字符串)。
【解决方案2】:
foreach ($arr as $a) {
   if (strpos($a,'oran') !== false) { ... }
}

我知道我们都在这么想。 /线程。

【讨论】:

    猜你喜欢
    • 2015-02-28
    • 2018-10-12
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多