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