php 按单词数组只应包含的单个字母数组过滤单词数组

rggaifut  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(122)

我现在有两个PHP数组:

  1. array('a','c','r','r')
  2. array('carr','car','arc','ra','c','abc','do','aa','rr')
    我想要的结果是:
    array('carr','car','arc','ra','c','rr')
    即,过滤掉'abc'、'do'、'aa',因为我希望过滤掉以下单词:
    1.不包含acr
    1.包含的acr比我在array 1中的要多/多。
    我试过array_filter(),但我似乎不能使它工作。
ioekq8ef

ioekq8ef1#

一种方法是:
使用array_count_values计算每个字母在第一个数组中出现的次数。
然后在array_filter回调函数中,将每个单词拆分为单个字母,并计算每个字母出现的次数。然后循环遍历这些已计数的字母。如果当前字母没有出现在letter-count-array中,或者其计数大于letter-count-array中的计数,则返回false。

$letters = ['a','c','r','r'];
$words = ['carr','car','arc','ra','c','abc','do','aa','rr'];

$letterCounts = array_count_values($letters);

$filtered = array_filter($words, function($word) use ($letterCounts) {
    $wordLetterCounts = array_count_values(mb_str_split($word));
    foreach($wordLetterCounts as $wordLetter => $count) {
        if(!isset($letterCounts[$wordLetter]) || $letterCounts[$wordLetter] < $count) {
            return false;
        }
    }
    return true;
});

var_dump($filtered);
lrl1mhuk

lrl1mhuk2#

当您替换单词数组时,您可以替换字母数组并进行单字母替换。如果单词中的所有字母都被消耗,则单词被保存。
正则表达式实际上并不是必需的,因为字母是文字,但是preg_replace()提供了一个限制参数,而str_replace()没有。
代码:(Demo

$needles = ['a','c','r','r'];
$haystacks = ['carr','car','arc','ra','c','abc','do','aa','rr', 'rrr'];

$result = [];
foreach ($haystacks as $i => $haystack) {
    foreach ($needles as $needle) {
        $haystack = preg_replace("/$needle/", '', $haystack, 1);
    }
    if (!$haystack) {
        $result[] = $haystacks[$i];
    }
}
var_export($result);

以上事实可以归结为:(Demo

$regexes = array_map(fn($v) => "/$v/", $needles);
var_export(
    array_filter(
        $haystacks,
        fn($hay) => !preg_replace($regexes, '', $hay, 1)
    )
);

相关问题