所以我需要的是比较字符串和数组(字符串作为干草堆和数组作为针)并从数组中重复的字符串中获取元素。为此,我采用了一个示例函数,在substr_count
函数中使用数组作为指针。
$animals = array('cat','dog','bird');
$toString = implode(' ', $animals);
$data = array('a');
function substr_count_array($haystack, $needle){
$initial = 0;
foreach ($needle as $substring) {
$initial += substr_count($haystack, $substring);
}
return $initial;
}
echo substr_count_array($toString, $data);
问题在于,如果我搜索'' 这样的字符,它会通过检查并验证为合法值,因为' a' 包含在第一个元素中。所以上面的输出1
。我认为这是由foreach()
引起的,但我该如何绕过呢?我想搜索整个字符串匹配,而不是部分匹配。
答案 0 :(得分:2)
您可以将$haystack
分解为单个单词,然后对in_array()
进行检查,以确保在执行substr_count()
之前该单词作为整个单词存在:
$animals = array('cat','dog','bird', 'cat', 'dog', 'bird', 'bird', 'hello');
$toString = implode(' ', $animals);
$data = array('cat');
function substr_count_array($haystack, $needle){
$initial = 0;
$bits_of_haystack = explode(' ', $haystack);
foreach ($needle as $substring) {
if(!in_array($substring, $bits_of_haystack))
continue; // skip this needle if it doesn't exist as a whole word
$initial += substr_count($haystack, $substring);
}
return $initial;
}
echo substr_count_array($toString, $data);
Here, cat
is 2, dog
is 2, bird
is 3, hello
is 1 and lion
is 0.
修改:这是使用array_keys()
并将搜索参数设置为$needle
的另一种选择:
function substr_count_array($haystack, $needle){
$bits_of_haystack = explode(' ', $haystack);
return count(array_keys($bits_of_haystack, $needle[0]));
}
当然,这种方法需要一根绳子作为针头。我不是100%确定为什么你需要使用一个数组作为针,但也许你可以在函数外面做一个循环,如果你需要,可以为每个针调用它 - 无论如何只是另一个选项!
答案 1 :(得分:0)
把我的解决方案放在戒指上;如scrowler所概述的基本思想是将搜索主题分解为单独的单词,以便您可以比较整个单词。
function substr_count_array($haystack, $needle)
{
$substrings = explode(' ', $haystack);
return array_reduce($substrings, function($total, $current) use ($needle) {
return $total + count(array_keys($needle, $current, true));
}, 0);
}
array_reduce()
步骤基本上是这样的:
$total = 0;
foreach ($substrings as $substring) {
$total = $total + count(array_keys($needle, $substring, true));
}
return $total;
array_keys()
表达式返回$needle
的键,其值等于$substring
。该数组的大小是出现的次数。