在 PHP 中对相同的数组元素进行分组
Group the same array element in PHP
我有这个功能来检查单词序列:
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);
$arr_scheme = explode(" ",trim(rtrim(rtrim($scheme,".")," ")));
echo '<br/>Scheme:';
var_dump($arr_scheme);
现在,我检查序列:
$result = sequence($arr_scheme, $arr_sample);
结果:
echo '<br/>Result:';
var_dump($result);
当我将变量 $sample
设置为
"branch science"
结果会 return true
。这很好。
但是当我将变量 sample
设置为
"branch of science"
结果将 return false
.
原因 - of
这个词多于 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);
}
您可以在 here 上进行更多研究。注:"Returns an array containing all of the values in array1 whose values exist in all of the parameters."。然后,在您的结果中查看,当您调用 var_dump($arr_scheme);
时,您会看到 "of" 出现了 3 次。比较后数组结果的大小是5。然而,数组$sample
的大小是3。所以,你可以理解为什么它returns false.
本案例的解决方案。你为什么不尝试使用正则表达式?或 strpos 函数?
我认为你应该选择 array_diff()。它计算数组和 returns 中 $arr_sample 中不存在于 $arr_scheme.
中的值的差异
所以,
array_diff($arr_sample, $arr_scheme)
如果 $arr_sample 中的所有值都出现在 $arr_scheme 中, 将 return 一个空数组
下一步是计算由 array_diff() 编辑的数组 return 的长度。如果等于0
,那么我们应该returntrue
return count(array_diff($arr_sample, $arr_scheme)) === 0;
上面的return语句可以表示为:
$diff = array_diff($arr_sample, $arr_scheme);
if (count($diff) === 0) {
return true;
} else {
return false;
}
根据您的评论,很明显您的函数应该 return true
如果 $arr_input 的所有元素都以相同的顺序出现在 $arr_scheme 中
它们出现在 $arr_scheme 中。否则它应该 return false
所以,
sequence(['branch', 'of', 'science', 'and', 'energy'], ['branch', 'of', 'energy'])
应该returntrue
和
sequence(['branch', 'of', 'science', 'and', 'energy'], ['science', 'of', 'branch'])
应该returnfalse
在这种情况下,函数 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;
}
$sequence_need = array_unique($sequence_need);
array_unique 删除数组中的所有重复值.. 重复的 'of' 将被删除.. 希望它有帮助..
我有这个功能来检查单词序列:
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);
$arr_scheme = explode(" ",trim(rtrim(rtrim($scheme,".")," ")));
echo '<br/>Scheme:';
var_dump($arr_scheme);
现在,我检查序列:
$result = sequence($arr_scheme, $arr_sample);
结果:
echo '<br/>Result:';
var_dump($result);
当我将变量 $sample
设置为
"branch science"
结果会 return true
。这很好。
但是当我将变量 sample
设置为
"branch of science"
结果将 return false
.
原因 - of
这个词多于 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);
}
您可以在 here 上进行更多研究。注:"Returns an array containing all of the values in array1 whose values exist in all of the parameters."。然后,在您的结果中查看,当您调用 var_dump($arr_scheme);
时,您会看到 "of" 出现了 3 次。比较后数组结果的大小是5。然而,数组$sample
的大小是3。所以,你可以理解为什么它returns false.
本案例的解决方案。你为什么不尝试使用正则表达式?或 strpos 函数?
我认为你应该选择 array_diff()。它计算数组和 returns 中 $arr_sample 中不存在于 $arr_scheme.
中的值的差异所以,
array_diff($arr_sample, $arr_scheme)
如果 $arr_sample 中的所有值都出现在 $arr_scheme 中,将 return 一个空数组
下一步是计算由 array_diff() 编辑的数组 return 的长度。如果等于0
,那么我们应该returntrue
return count(array_diff($arr_sample, $arr_scheme)) === 0;
上面的return语句可以表示为:
$diff = array_diff($arr_sample, $arr_scheme);
if (count($diff) === 0) {
return true;
} else {
return false;
}
根据您的评论,很明显您的函数应该 return true
如果 $arr_input 的所有元素都以相同的顺序出现在 $arr_scheme 中
它们出现在 $arr_scheme 中。否则它应该 return false
所以,
sequence(['branch', 'of', 'science', 'and', 'energy'], ['branch', 'of', 'energy'])
应该returntrue
和
sequence(['branch', 'of', 'science', 'and', 'energy'], ['science', 'of', 'branch'])
应该returnfalse
在这种情况下,函数 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;
}
$sequence_need = array_unique($sequence_need);
array_unique 删除数组中的所有重复值.. 重复的 'of' 将被删除.. 希望它有帮助..