在PHP中将同一数组元素分组

在PHP中将同一数组元素分组,php,arrays,Php,Arrays,我有这个功能来检查单词序列: 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 tr

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

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;
    }
$result = sequence($arr_scheme, $arr_sample);
有我的
样本
方案
变量:

$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);

结果是:

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

当我将变量
$sample
设置为
“分支科学”
结果将
返回true
。这很好

但是,当我将变量
sample
设置为
“科学分支”
结果将
返回false

原因的
一词不止一个,我如何解决这个问题


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

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);
}
你可以在网站上进行更多的研究。注意:“返回一个数组,该数组包含array1中的所有值,其值存在于所有参数中。”。然后,在调用
var\u dump($arr\u scheme)时,查看结果,您会看到“of”出现3次。比较后的数组结果大小为5。但是,数组
$sample
的大小是3。因此,您可以理解它返回false的原因


本案例的解决方案。为什么不尝试使用正则表达式呢?还是strpos功能?

我认为你应该选择。它计算数组的差异,并返回$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\u输入的所有元素都以相同的顺序出现在$arr\u方案中 它们出现在$arr_方案中。否则它应该返回
false

所以

序列(['branch','of','science','and','energy',['branch','of','energy'])

应返回
true

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

序列(['branch','of','science','and','energy',['science','of','branch'])

应返回
false

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

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;
}

数组\u unique删除数组中的任何重复值。。“的”副本将被删除。。希望有帮助。

可能是
array\u unique
可以帮助吗?哦。。。好的,我需要先试试。不,如果使用unique,您将在其他方面失败,例如
物质属性
要求不明确。该函数应在何时返回
TRUE
?描述所有规则或张贴更多的例子。按顺序排列单词例如:如果句子是“more”+“one”。当我将
$sample
设置为
“相关科学分支”
时,“more”一词应该出现在“one”之前,它将返回false..它应该返回true请测试新答案。到目前为止还不错。我会尝试很多次。。。我接受这个答案。如果只使用
$o=reset($occurrences)
而不是循环,你可能会得到同样的结果。这是我的测试代码
$mystring=“有关物质和能量的性质和属性的科学分支”$findme=‘科学分支’$pos=strpos($mystring,$findme);如果($pos==false){echo“字符串“$mystring”中未找到字符串“$findme”;}否则{echo”字符串“$findme”在字符串“$mystring”中找到;echo“并且存在于位置$pos”;}
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;
}
$sequence_need = array_unique($sequence_need);