在PHP中使用substr_count()和数组

时间:2014-07-18 03:32:33

标签: php arrays substring

所以我需要的是比较字符串和数组(字符串作为干草堆和数组作为针)并从数组中重复的字符串中获取元素。为此,我采用了一个示例函数,在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()引起的,但我该如何绕过呢?我想搜索整个字符串匹配,而不是部分匹配。

2 个答案:

答案 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。该数组的大小是出现的次数。