Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法生成';相关术语';使用strpos的代码在PHP中工作_Php_Strpos - Fatal编程技术网

无法生成';相关术语';使用strpos的代码在PHP中工作

无法生成';相关术语';使用strpos的代码在PHP中工作,php,strpos,Php,Strpos,我要做的是从用户那里获取一个输入文本(例如,让我们说“Java程序员”),并尝试将这个用户输入与我存储在数组中的字符串列表相匹配,比如“Java程序员是个好孩子”,“他有时会打球”,“Java和狗互相憎恨”,“狗不是Java程序员” 我正在尝试进行单词匹配,以便程序输出数组中匹配用户查询中所有单词的所有字符串的列表(顺序不重要) 所以我希望下面代码的输出是 “Java程序员是个好孩子” “狗不是java程序员” 因为根据用户输入的查询,这些术语同时包含“java”和“程序员” 这是我写的代码,它

我要做的是从用户那里获取一个输入文本(例如,让我们说“Java程序员”),并尝试将这个用户输入与我存储在数组中的字符串列表相匹配,比如“Java程序员是个好孩子”,“他有时会打球”,“Java和狗互相憎恨”,“狗不是Java程序员”

我正在尝试进行单词匹配,以便程序输出数组中匹配用户查询中所有单词的所有字符串的列表(顺序不重要)

所以我希望下面代码的输出是

“Java程序员是个好孩子” “狗不是java程序员”

因为根据用户输入的查询,这些术语同时包含“java”和“程序员”

这是我写的代码,它不工作。任何帮助都将不胜感激

<?php
$relatedsearches = array();
$querytowords = array();
$string = "Java programmer"; //GET INPUT FROM USER
$querywords = (explode(' ', $string));
foreach($querywords as $z)
    {
            $querytowords[] = $z;
            }

//ARRAY THAT STORES MASTER LIST OF QUERIES

$listofsearhches = array('Java programmer is a good boy', 'he plays ball at times', 'java and dogs hate each other', ' dogs are not java programmers');

foreach($listofsearhches as $c)
    {
    for ($i=0; $i<=(count($querytowords)-1); $i++)
        {   
        if(strpos(strtolower($c), strtolower($querytowords[$i])) === true)
            { 
            if($i=(count($querytowords)-1))
                {
                $relatedsearches[] = $c;
                } 
            } else { break; }
        }
    }

echo '<br>';
if(empty($relatedsearches))
    {
        echo 'Sorry No Matches found';
    } 
    else 
    {
    foreach($relatedsearches as $lister)
        {
                echo $lister;
                echo '<br>';
                }
            }

?>

无需分解
$string
,因为您正在将单词java和programmer作为字符串“java程序员”查找。所以你的祖先需要像这样

 foreach($listofsearhches as $c)
{   
    if(strpos(strtolower($c), strtolower($string)) === true)
        {            
            $relatedsearches[] = $c;

        } else { break; }

}

我会这样做:-

$matches = array();
$string = 'java programmer';
$stringBits = explode(' ', $string);
$listOfSearches = array('Java programmer is a good boy', 'he plays ball at times', 'java and dogs hate each other', ' dogs are not java programmers');

foreach($listOfSearches as $l) {
  $match = true;
  foreach($stringBits as $b) {
    if(!stristr($l, $b)) {
      $match = false;
    }
  }
  if($match) {
    $matches[] = $l;
  }
}

if(!empty($matches)) {
  echo 'matches: ' . implode(', ', $matches);
} else {
  echo 'no matches found';
}
因此,在要搜索的字符串列表上循环,设置一个标志(
$match
),然后为
$string
中的每个单词检查它是否存在于当前
$listofsearchs
字符串中的某个位置,如果一个单词不存在,它会将
$match
设置为false

检查每个单词后,如果
$match
仍为
true
,则将
$listofsearchs
中的当前字符串添加到
$matches
数组中。


<?php
    $string = "Java programmer"; //GET INPUT FROM USER
    $querywords = (explode(' ', $string));
    $relatedsearches = array();
    $listofsearhches = array('Java programmer is a good boy', 'he plays ball at times', 'java and dogs hate each other', ' dogs are not java programmers');
    foreach ($listofsearhches as $c) {
        foreach($querywords as $word){
            if(strpos(strtolower($c), strtolower($word)) !== false){
                if(!in_array($c, $relatedsearches))
                    $relatedsearches[] = $c;     

                break;
            }
        } 
    }

    echo '<br>';
    if (count($relatedsearches) < 1) {
        echo 'Sorry No Matches found';
    } 
    else {
        foreach ($relatedsearches as $lister) {
            echo $lister;
            echo '<br>';
        }
    }
?>

试一试

谢谢你的回复!你的解决方案不适用于像“他热爱Java,是一个程序员”这样的字符串,这两个词也有,但彼此不相邻。编辑:不,我不想把“Java”和“程序员”作为字符串。任何地方出现的“Java”和“程序员”都是我要寻找的,这就是为什么我经常使用它的原因!除了“foreach($b)中的一个小错误之外,你的代码工作起来很有魅力。很抱歉,我几分钟前才注意到:谢谢你的回复!这是可行的,但即使查询中有一个单词,它也会匹配字符串。例如,我在运行这个时得到的输出是..'Java程序员是个好孩子“Java和狗互相憎恨”“狗不是Java程序员”我想这就是你想要的。。你所需要的只是一点点扭转你可以得到你想要的。。。如果你仍然需要,我可以修改一点,让它为你工作,我很抱歉,我认为我没有解释得很好。谢谢,非常感谢您的帮助,但是另一个代码“deifwod”起作用了。再次感谢:)