求统计一个连续的字符串的方法 ABAB ABCABC AB**AB ABCDE

pkkgu 2013-01-26 09:21:35
<?php
//$a为10位随机值
//只统计连续的两位数以上
$a=7641235123; //ABC**ABC类型
echo '想要得到123';
echo '出现了2次';

$a=76401235123; //ABCD类型
echo '想要得到0123';
echo '出现了1次';

$a=7642351236; //ABC类型
echo '想要得到123';
echo '出现了1次';

$a=4567545679; //ABCD**ABCD类型
echo '想要得到4567';
echo '出现了2次';

$a=0123012389; //ABCDABCD类型
echo '想要得到0123';
echo '出现了2次';

//连续的数值应该只有以下可能,如果用选循环数组方对比,效率很低吧
$arr=array();
$arr[]='01';
$arr[]='012';
$arr[]='0123';
$arr[]='01234';
$arr[]='012345';
$arr[]='0123456';
$arr[]='01234567';
$arr[]='012345678';
$arr[]='0123456789';

$arr[]='12';
$arr[]='123';
$arr[]='1234';
$arr[]='12345';
$arr[]='123456';
$arr[]='1234567';
$arr[]='12345678';
$arr[]='123456789';
$arr[]='1234567890';

$arr[]='23';
$arr[]='234';
$arr[]='2345';
$arr[]='23456';
$arr[]='234567';
$arr[]='2345678';
$arr[]='23456789';
$arr[]='234567890';

$arr[]='34';
$arr[]='345';
$arr[]='3456';
$arr[]='34567';
$arr[]='345678';
$arr[]='3456789';
$arr[]='34567890';

$arr[]='45';
$arr[]='456';
$arr[]='4567';
$arr[]='45678';
$arr[]='456789';
$arr[]='4567890';

$arr[]='56';
$arr[]='567';
$arr[]='5678';
$arr[]='56789';
$arr[]='567890';

$arr[]='67';
$arr[]='678';
$arr[]='6789';
$arr[]='67890';

$arr[]='78';
$arr[]='789';
$arr[]='7890';

$arr[]='89';
$arr[]='890';

$arr[]='90';
?>
...全文
281 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ImN1 2013-01-26
  • 打赏
  • 举报
回复
这个思路简单点,效率可能没有唠叨的高 我的机器没有装php,随手写的,自己测试一下有没有错误

<?php
$a = 7641235123;
$arr = preg_split('//', (string)$a, -1);
$b=array();
$i=0;
foreach($arr as $k=>$v){
	if ($v == $arr[$k-1]+1){
		if ($arr[$k-1] != $arr[$k-2]+1) $b[$i][]=$arr[$k-1];
		$b[$i][]=$v;
	}else $i++;
}
//没搞错的话$b里面“key-1”是第几个字符开始连续,有需要可以在下面继续保留使用,这里忽略掉了
foreach($b as $k=>$v) $c[]=implode('',$v);
$d=array_count_values($c);
var_export($d);
?> 
pkkgu 2013-01-26
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
可考虑在此基础上修改 PHP code?12345678910111213141516$a = array('7641235123','76401235123','7642351236','4567545679','0123012389',);foreach($a as $i=>$v) { echo "$v : "; if(preg_match_all('/(.{2……
$a=76401235123; //ABCD类型
echo '想要得到0123';
echo '出现了1次';
这个要取0123 怎么取
pkkgu 2013-01-26
  • 打赏
  • 举报
回复
$a=76401235123; //ABCD类型
echo '想要得到0123';
echo '出现了1次';
这个要取0123 怎么取
xuzuning 2013-01-26
  • 打赏
  • 举报
回复
可考虑在此基础上修改
$a = array(
'7641235123',
'76401235123',
'7642351236',
'4567545679',
'0123012389',
);
foreach($a as $i=>$v) {
  echo "$v : ";
  if(preg_match_all('/(.{2,}).*(\\1)/', $v, $r)) {
    $t = $r[1][0];
    if($t{0}+strlen($t)-1 == substr($t, -1))
      echo $r[1][0] . ' ' . (count($r)-1);
  }
  echo PHP_EOL;
}
7641235123 : 123 2 76401235123 : 123 2 7642351236 : 23 2 4567545679 : 4567 2 0123012389 : 0123 2
pkkgu 2013-01-26
  • 打赏
  • 举报
回复
引用 1 楼 snmr_com 的回复:
用堆栈的方法的,一次pop()或shift()一个首/尾字符
给个例子吧
ImN1 2013-01-26
  • 打赏
  • 举报
回复
用堆栈的方法的,一次pop()或shift()一个首/尾字符

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧