如何使用PHP在数组中找到以前未知的模式?

时间:2012-01-26 02:36:49

标签: php arrays

我有一个具有以下值的数组:1,1,3,5,1,1,3,5,1,1,3,5,1,1,3,5

您可以轻松查看此数组,并看到模式1,1,3,5重复4次 我如何让PHP为我解决这个问题? 此外,我的数组可能有多个需要找到的模式 例如,如果数组是:1,2,1,2,1,2,4,5,5,5
我需要输出像“模式1,2重复3次4次重复1次和5次重复3次。”
最终我想要做的是上传一个CSV文件并解析它,以便用简单的英文阅读。

4 个答案:

答案 0 :(得分:1)

这是我得到的:

$arr=array(1,1,3,5,1,1,3,5,1,1,3,5,1,1,3,5);
$p=array();
for($i=0;$i<count($arr);$i++){
    $tmp=$arr[$i].'';
    for($j=$i;$j<count($arr);$j++){
        $tmp.=','.$arr[$j];
        if(isset($p[$tmp])){
            //nope
        }
        else{
            //nice try
        }
    }

}
foreach($p as $key=>$val){
    if($val>1)
    echo "The patter: $key appeared $val times<br>";
}

不是逐字逐句。我可能删除了两行和总共4个其他字符。祝你好运找到了什么!

答案 1 :(得分:0)

我将获取数组并循环获取它的第一个n值,并在数组中查找它们,然后存储连续出现的次数,递增n并再次执行。所以它需要1,而事件将是一个。那么它将需要1,1而且仍然是一个。然后是1,1,3,它仍然是一个。那么1,1,3,5就是四个。在这一点上,它继续采取1,1,3,5,1并寻找它,再给一个。由于这小于最后找到的(四),它会停止,收回最后一个模式,将其存储在具有重复次数的另一个数组中,然后从数组中移出所有重复的模式,重新开始。这是概念,实现它,好吧,我将继续努力。 :P

答案 2 :(得分:0)

你应该实现并修改一个名为turtle和hare的算法,它可以检测周期(http://en.wikipedia.org/wiki/Cycle_detection)。 通过修改它,您可以计算不同模式的重复。

您也可以尝试生成字符串的所有子序列,表示数组元素的串联,但它根本没有优化(只要数组的长度很高)。

答案 3 :(得分:0)

这可能有助于找到所有类似的模式。

$arr = array(1,1,3,5,1,1,3,5,1,1,3,5,1,1,3,5,1,1,3,5);
$data = implode('', $arr);  
for($i=0; $i < count($arr)-1; $i++){
$pattern .= $arr[$i];
if (substr_count($data ,$pattern) !=1)
echo $pattern . ' found '.substr_count($data ,$pattern). ' times<br />';
}