strpos
搜索字符串时,如何使用针阵列?例如:
$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
if(strpos($string, $find_letters) !== false)
{
echo 'All the letters are found in the string!';
}
因为当使用它时,它将不起作用,如果有这样的东西,那会很好
Answers:
@Dave来自http://www.php.net/manual/zh/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"
。
更新:改进的代码,发现第一个指针时停止:
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
strposa
将遍历所有文本,但这不是必需的!我可以理解吗?
foreach($needle as $k => $query) { if(strpos($haystack, $query, $offset) !== false) return $k; }
,因此它返回了匹配项的密钥以进行进一步处理。
下面的代码不仅显示了如何执行此操作,还将其置于易于使用的函数中。它是由“ jesda”撰写的。(我在网上找到了)
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
。
!== flase
吗?
问题是,提供的示例只是一个“示例”,还是您所要的?这里有很多不同的答案,我不理解被接受的答案的复杂性。
要找出字符串中是否存在针阵列的任何内容,并快速返回true或false:
$string = 'abcdefg';
if(str_replace(array('a', 'c', 'd'), '', $string) != $string){
echo 'at least one of the needles where found';
};
如果是这样,请给@Leon信誉。
为了查明字符串中是否存在针阵列的所有值,在这种情况下,必须同时显示所有三个和所有值,就像您提到的“例如”'a', 'b'
'c'
echo'在字符串中找到所有字母!';
这里有许多答案不在此范围内,但我怀疑您标记为已解决的问题的意图。例如,可接受的答案是
$array = array('burger', 'melon', 'cheese', 'milk');
如果必须在字符串中找到所有这些单词怎么办?
然后,您可以"not accepted answers"
在此页面上尝试一些。
您可以尝试以下方法:
function in_array_strpos($word, $array){
foreach($array as $a){
if (strpos($word,$a) !== false) {
return true;
}
}
return false;
}
这是我的方法。遍历字符串中的字符,直到找到匹配项。在更大数量的针上,这将胜过公认的答案,因为它不需要检查每根针来确定是否找到了匹配项。
function strpos_array($haystack, $needles = [], $offset = 0) {
for ($i = $offset, $len = strlen($haystack); $i < $len; $i++){
if (in_array($haystack[$i],$needles)) {
return $i;
}
}
return false;
}
我根据公认的答案对它进行了基准测试,并提供了超过7个的数组,$needles
这大大加快了速度。
我正在写一个新的答案,希望可以帮助寻找与我相似的人。
在“我有多个针头,并且我正试图使用它们来查找单根弦”的情况下,此方法有效。这是我遇到的一个发现问题。
$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
将包含所有匹配针的列表,具有最高计数值的数组项将是您要查找的字符串,您可以通过以下方法获得:
print_r(array_search(max($found), $found));
回复@binyamin和@Timo ..(没有足够的点来添加注释..),但是结果不包含位置。.
下面的代码将返回第一个元素的实际位置,这是strpos想要的做。如果您希望找到精确的1个匹配项,这将非常有用。
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;
}
只是以上答案的升级
function strsearch($findme, $source){
if(is_array($findme)){
if(str_replace($findme, '', $source) != $source){
return true;
}
}else{
if(strpos($source,$findme)){
return true;
}
}
return false;
}