PHP数组过滤:按指定单字母数组筛选符合条件的单词
解决PHP数组过滤问题:按字符范围和出现次数筛选单词
需求回顾
给定两个PHP数组:
- 字符池数组:
array('a','c','r','r') - 待筛选单词数组:
array('carr','car','arc','ra','c','abc','do','aa','rr')
需要筛选出符合以下条件的单词:
- 仅包含
a、c、r三种字符 - 每个字符的出现次数不超过字符池数组中对应字符的总数量(比如
a最多1次,c最多1次,r最多2次)
最终期望结果:array('carr','car','arc','ra','c','rr')
实现方案
用array_filter()配合自定义回调函数就能完成筛选,核心是先统计字符池的字符频次,再对每个单词做双重校验:
<?php // 字符池数组 $sourceArr = array('a','c','r','r'); // 待筛选的单词数组 $wordsArr = array('carr','car','arc','ra','c','abc','do','aa','rr'); // 统计字符池中各字符的出现次数 $charLimits = array_count_values($sourceArr); // 允许的字符集合 $allowedChars = array_keys($charLimits); // 过滤数组 $filteredWords = array_filter($wordsArr, function($word) use ($charLimits, $allowedChars) { // 将单词拆分为单个字符数组 $wordChars = str_split($word); // 校验1:单词是否包含非允许字符 if (count(array_diff($wordChars, $allowedChars)) > 0) { return false; } // 统计当前单词中各字符的出现次数 $wordCharCounts = array_count_values($wordChars); // 校验2:每个字符的出现次数是否超过字符池的限制 foreach ($wordCharCounts as $char => $count) { if ($count > $charLimits[$char]) { return false; } } return true; }); // 重置数组索引(可选,根据需求决定) $filteredWords = array_values($filteredWords); // 输出结果 print_r($filteredWords); ?>
代码说明
- 统计字符池频次:用
array_count_values()把字符池转换成[字符 => 最大允许次数]的关联数组,这里得到array('a'=>1, 'c'=>1, 'r'=>2) - 字符范围校验:用
array_diff()对比单词字符和允许字符集合,若存在差异则说明有非法字符,直接过滤 - 次数校验:统计单词的字符频次,逐个和字符池的限制对比,只要有一个字符超量就过滤该单词
- 重置索引:
array_filter()会保留原数组索引,用array_values()可以重新生成连续索引
运行上述代码后,输出结果就是你期望的筛选后的数组。
内容的提问来源于stack exchange,提问作者user12148446
相关产品推荐
相关产品推荐

