我有一组随机字母的字符串,我需要知道数组成员之间哪些字母是一致的。字母的数量很重要。
我的方法现在循环遍历数组,进行拆分,然后循环遍历spitted字符串以计算每个字母的出现次数,然后使用letter => count
更新数组
然后执行一个array_reduce,它创建一个只出现在所有数组中的新成员数组。但是,它没有用。
<?
$a[] = "emaijuqqrauw";
$a[] = "aaeggimqruuz";
$a[] = "aabimqrtuuzw";
$a[] = "aacikmqruuxz";
$a[] = "aacikmqruuxz";
$a[] = "aaciimqruuxy";
foreach($a as $b){
$n = str_split($b, 1);
foreach($n as $z){
$arr[$z] = substr_count($b, $z);
}
ksort($arr);
$array[] = $arr;
unset($arr);
}
$n = array_reduce($array, function($result, $item){
if($result === null){
return $item;
}else{
foreach($item as $key => $val){
if(isset($result[$key])){
$new[$key] = $val;
}
}
return $new;
}
});
foreach($n as $key => $val){
echo str_repeat($key, $val);
}
返回aaiimqruu
- 这是正确的,但在数组的最后一个元素中只有2 i
。其余只有一个i
。我不确定如何进一步打破它并让它返回aaimqruu
- 然后我会弹出一个SQL查询来查找匹配的单词,aquarium
答案 0 :(得分:1)
有array_intersect(),这很可能是你想要的。给定$ a数组,你可以这样做:
$a = array(.... your array...);
$cnt = count($a);
for($i = 0; $i < $cnt; $i++) {
$a[$i] = explode('', $a[$i]); // split each string into array of letters
}
$common = $a[0]; // save the first element
for($i = 1; $i < $cnt; $i++) {
$common = array_intersect($common, $a[$i]);
}
var_dump($common);
答案 1 :(得分:1)
你这样做怎么样?找出整个数组中项目的出现次数。
function findDuplicate($string, $array) {
$count = 0;
foreach($array as $item) {
$pieces = str_split($item);
$pcount= array_count_values($pieces);
if(isset($pcount[$string])) {
$count += $pcount[$string];
}
}
return $count;
}
echo findDuplicate("a",$a);
使用你的阵列给出 12 ,这是正确的。
我的解决方案已经有了你的答案
$pieces = str_split($item);
$pcount= array_count_values($pieces);
//$pcount contains, every count like [a] => 2
答案 2 :(得分:0)
似乎array_reduce
对于这个目的来说是最好的功能,但是我没想到添加一个条件来给我想要的效果。
$new[$key] = ($result[$key] > $val) ? $val : $result[$key];
替换
$new[$key] = $val;
做了这个伎俩。