确定字符串数组之间的重复字母数

时间:2012-03-18 04:05:10

标签: php

我有一组随机字母的字符串,我需要知道数组成员之间哪些字母是一致的。字母的数量很重要。

我的方法现在循环遍历数组,进行拆分,然后循环遍历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

3 个答案:

答案 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;

做了这个伎俩。