在strpos中使用数组作为针

在searchstring时,如何使用strpos查找一列针? 例如:

 $find_letters = array('a', 'c', 'd'); $string = 'abcdefg'; if(strpos($string, $find_letters) !== false) { echo 'All the letters are found in the string!'; } 

因为当使用这个,它不会工作,如果有这样的事情会很好

@从http://www.php.net/manual/en/function.strpos.php#107351更新摘要;

 function strposa($haystack, $needles=array(), $offset=0) { $chr = array(); foreach($needles as $needle) { $res = strpos($haystack, $needle, $offset); if ($res !== false) $chr[$needle] = $res; } if(empty($chr)) return false; return min($chr); } 

如何使用:

 $string = 'Whis string contains word "cheese" and "tea".'; $array = array('burger', 'melon', 'cheese', 'milk'); if (strposa($string, $array, 1)) { echo 'true'; } else { echo 'false'; } 

将返回true ,因为array "cheese"

更新:find第一个针时停止的改进代码:

 function strposa($haystack, $needle, $offset=0) { if(!is_array($needle)) $needle = array($needle); foreach($needle as $query) { if(strpos($haystack, $query, $offset) !== false) return true; // stop on first true result } return false; } $string = 'Whis string contains word "cheese" and "tea".'; $array = array('burger', 'melon', 'cheese', 'milk'); var_dump(strposa($string, $array)); // will return true, since "cheese" has been found 

下面的代码不仅说明了如何去做,而且还把它放在一个易于使用的function前进中。 它是由“jesda”写的。 (我在网上find它)

PHP代码:

 <?php /* strpos that takes an array of values to match against a string * note the stupid argument order (to match strpos) */ function strpos_arr($haystack, $needle) { if(!is_array($needle)) $needle = array($needle); foreach($needle as $what) { if(($pos = strpos($haystack, $what))!==false) return $pos; } return false; } ?> 

用法:

 $needle = array('something','nothing'); $haystack = "This is something"; echo strpos_arr($haystack, $needle); // Will echo True $haystack = "This isn't anything"; echo strpos_arr($haystack, $needle); // Will echo False 

如果strpos返回false则可以迭代数组并设置“标志”值。

 $flag = false; foreach ($find_letters as $letter) { if (strpos($string, $letter) === false) { $flag = true; } } 

然后检查$flag的值。

这个expression式search所有字母:

 count(array_filter( array_map("strpos", array_fill(0, count($letters), $str), $letters), "is_int")) == count($letters) 

如果你只是想检查某些字符是否在string中,请使用strtok :

 $string = 'abcdefg'; if (strtok($string, 'acd') === $string) { // not found } else { // found } 

str_replace速度要快得多。

 $find_letters = array('a', 'c', 'd'); $string = 'abcdefg'; $match = (str_replace($find_letters, '', $string) != $string); 

问题是,所提供的例子只是一个“例子”,或者你正在寻找什么? 这里有许多复杂的答案,我不明白接受的答案的复杂性。

要找出string中是否存在任何 针头数组的内容,并快速返回true或false:

 $string = 'abcdefg'; if(str_replace(array('a', 'c', 'd'), '', $string) != $string){ echo 'at least one of the needles where found'; }; 

如果所以请给予@Leon的信用。

为了确定string中是否存在针数组的 所有值,就像在这种情况下一样,所有三个'a', 'b''c'必须存在,就像你提到的“例如”

回声'所有的字母都在string中find!';

这里有很多答案,但是我怀疑这个问题的内涵是否被标记为已解决。 如接受的答案是一针

 $array = array('burger', 'melon', 'cheese', 'milk'); 

如果所有这些字都必须在string中find呢?

然后你在这个页面上尝试一些"not accepted answers"

用下面的代码:

 $flag = true; foreach($find_letters as $letter) if(false===strpos($string, $letter)) { $flag = false; break; } 

然后检查$flag的值。 如果是true ,所有的字母都被find了。 如果没有,这是false

你可以试试这个:

 function in_array_strpos($word, $array){ foreach($array as $a){ if (strpos($word,$a) !== false) { return true; } } return false; } 

我正在写一个新的答案,希望能帮助任何寻找类似于我的人。

这适用于“我有多个针,我试图用它们find一个单独的string”。 这是我遇到的问题。

  $i = 0; $found = array(); while ($i < count($needle)) { $x = 0; while ($x < count($haystack)) { if (strpos($haystack[$x], $needle[$i]) !== false) { array_push($found, $haystack[$x]); } $x++; } $i++; } $found = array_count_values($found); 

数组$found将包含所有匹配的针的列表,具有最高计数值的数组的项目将是您正在寻找的string,您可以通过以下方式获得:

 print_r(array_search(max($found), $found)); 

您也可以尝试使用strpbrk()进行否定(没有find任何字母):

 $find_letters = array('a', 'c', 'd'); $string = 'abcdefg'; if(strpbrk($string, implode($find_letters)) === false) { echo 'None of these letters are found in the string!'; } 

回复@binyamin和@Timo ..(没有足够的点添加评论..)但结果不包含位置..
下面的代码将返回第一个元素的实际位置,这是strpos打算执行的操作。 如果您期望find完全匹配的1个匹配项,那么这非常有用。如果您期望find多个匹配项,那么首先find的位置可能没有意义。

 function strposa($haystack, $needle, $offset=0) { if(!is_array($needle)) $needle = array($needle); foreach($needle as $query) { $res=strpos($haystack, $query, $offset); if($res !== false) return $res; // stop on first true result } return false; }