验证字符串中是否存在多词短语

问题描述 投票:0回答:4

我有这个功能来检查单词序列:

function sequence($arr_scheme = [], $arr_input = [])
    {
        $sequence_need = array_values(array_intersect($arr_scheme, $arr_input));
        if(!empty($arr_input) && ($sequence_need == $arr_input)):
            return true;
        else:
            return false;
        endif;
    }

有我的

sample
scheme
变量:

$sample = "branch of science";
$scheme = "The branch of science concerned of nature and property of matter and energy";

我已转换为数组:

$arr_sample = explode(" ",trim(rtrim(rtrim($sample,".")," ")));
 echo 'Sample:';
var_dump($arr_sample);

enter image description here

$arr_scheme = explode(" ",trim(rtrim(rtrim($scheme,".")," ")));
echo '<br/>Scheme:';
var_dump($arr_scheme);

enter image description here

现在,我检查序列:

$result = sequence($arr_scheme, $arr_sample);

结果:

echo '<br/>Result:';
var_dump($result);

enter image description here

当我将变量

$sample
设置为
"branch science"
结果将
return true
。这很好。

但是当我将变量

sample
设置为
"branch of science"
结果将
return false
.

原因 -

of
这个词大于1,我该如何解决这个问题?

word of **<code>of</code>** 大于 1 使其返回 false

php string validation contains cpu-word
4个回答
1
投票

查找方案中的第一个输入单词(可以是多个)。
然后对其余数组运行递归。

function sequence($arr_scheme = [], $arr_input = [])
{
  if (!$arr_input) return true;
  $first = array_shift($arr_input);
  $occurences = array_keys($arr_scheme, $first);
  if (!$occurences) return false;

  foreach ($occurences as $o) { // loop first word occurences
    $found = sequence(array_slice($arr_scheme, $o), $arr_input);
    if ($found) return true;
  }
  return false;
}

第一个单词随后出现对于匹配来说应该没有任何影响。
所以,这个尾递归函数会工作得更好:

function sequence($arr_scheme = [], $arr_input = [])
{
  if (!$arr_input) return true;
  $first = array_shift($arr_input);
  $index = array_search($arr_scheme, $first);
  if ($index === false) return false; // not found
  return sequence(array_slice($arr_scheme, $index), $arr_input);
}

0
投票

您可以在这里进行更多研究。注意:“返回一个数组,其中包含 array1 中的所有值,其值存在于所有参数中。”。然后,看看你的结果,当你调用

var_dump($arr_scheme);
时,你会看到“of”出现了 3 次。比较后数组结果的大小是 5。然而,数组
$sample
的大小是 3。所以,你可以理解为什么它返回 false。

本例的解决方案。你为什么不尝试使用正则表达式?或者 strpos 函数?


0
投票
$sequence_need = array_unique($sequence_need);

array_unique 删除数组中的所有重复值.. 重复的“of”将被删除.. 希望它有帮助..


0
投票

我认为你应该使用array_diff()。它计算数组的差异并返回 $arr_sample 中不存在于 $arr_scheme 中的值。

那么,

array_diff($arr_sample, $arr_scheme)

如果 $arr_sample 中的所有值都存在于 $arr_scheme 中,将返回一个空数组

下一步是计算 array_diff() 返回的数组的长度。如果它等于

0
,那么我们应该返回
true

return count(array_diff($arr_sample, $arr_scheme)) === 0;

上面的返回语句可以表示为:

$diff = array_diff($arr_sample, $arr_scheme);
if (count($diff) === 0) {
    return true;
} else {
    return false;
}

从您的评论中可以清楚地看出您的函数应该返回

true
如果 $arr_input 的所有元素都以相同的顺序出现在 $arr_scheme 中 它们出现在 $arr_scheme 中。否则它应该返回
false

那么,

sequence(['branch', 'of', 'science', 'and', 'energy'], ['branch', 'of', 'energy'])

应该返回

true

sequence(['branch', 'of', 'science', 'and', 'energy'], ['science', 'of', 'branch'])

应该返回

false

在这种情况下,函数sequence()可以定义如下:

function sequence($arr_scheme = [], $arr_input = [])
{
    //test if all elements of $arr_input are present in $arr_scheme
    $diff = array_diff($arr_input, $arr_scheme);
    if ($diff) {
        return false;
    }
    foreach ($arr_input as $value) {
        $pos = array_search($value, $arr_scheme);
        if (false !== $pos ) {
            $arr_scheme = array_slice($arr_scheme, $pos + 1);
            continue;
        }
        return false;
    }
    return true;
}
© www.soinside.com 2019 - 2024. All rights reserved.