PHP算法求解
天蓬老师
天蓬老师 2017-04-11 09:00:20
[PHP讨论组]

设,有数组:

$arr = [3, 1, 2, 4, 8, 7, 9, 10, 13, 15];

写一个函数,使其输出格式为:

$arr = array(
        0 => '1~4',
        1 => '7~10',
        2 => '13',
        3 => '15'
);


补充:
感谢已经回答的各位道友!
数组$arr的长度是不固定的,内容也是动态的,仅已知这个数组是一维数组,数组键值也可能是个字符串类型!

补充:再次谢谢诸位道友! 我也琢磨了个函数,分享一下,望批评!

$arr = [3, 1, 2, 4, 7, 8, 9, 10, 13, 15, 15, 'sdfsf'];

function foo($arr)
{
    asort($arr);
    $cur = 0;
    $list = [];
    foreach ($arr as $k => $v){
        //如果不是数值或者是空则剔除此元素,进入下个循环
        if(!is_numeric($v) || empty($v)) {
            unset($arr[$k]);
            continue;
        }
        //如果连续中的末尾数值和当前数值相差为1,则继续压入该连续段$list[$cur],否则建立下个连续段
        if(!empty($list[$cur]) && ($v - end($list[$cur]) > 1)){
            $cur++;
        }
        //如果连续段中已经存在该值则进入下一循环
        elseif(!empty($list[$cur]) && in_array($v, $list[$cur])){
            continue;
        }
        //压入
        $list[$cur][] = $v;
    }
    //把压好的数组进行格式化(变成 a~b )样式
    foreach ($list as $k => $v){
        //保险起见 再排个序
        asort($v);
        //如果数组中不止一个元素
        if(count($v) > 1){
            $list[$k] = $v[0]. '~'. end($v);
        }
        else{
            $list[$k] = $v[0];
        }
    }
    return $list;
}

echo '
';
var_export(foo($arr));

打印结果:

array (
  0 => '1~4',
  1 => '7~10',
  2 => 13,
  3 => 15,
)

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(7)
天蓬老师
$arr = [3, 1, 2, 4, 8, 7, 9, 10, 13, 15];

function array_section($arr=[], $section=[])
{
  $data = [];
  sort($arr);
  $count = count($section);
  $i = 0;
  while ($i < $count) {
    $j = 0;
    while ($j < $section[$i]) {
      $data[$i][$j] = array_shift($arr);
      ++$j;
    }
    ++$i;
  }
  return $data;
}

print_r(array_section($arr, [4, 4, 1, 1]));
PHPz

连续的就放到一个下标下面就行。

伊谢尔伦

先排个序 再分段吧

大家讲道理
<?php
$arr = array(3, 1, 2, 4, 3,8, 7, 9, 10, 13, 15,15);

//排序
sort($arr);
$ret = array();

function sortRange($arr,&$ret){
    //缓存最大值,最小值
    $min = array_shift($arr);
    $max =  $min;
        foreach ($arr as $item){
            if($item == $max+1){//如果连续,就替换最大值,并继续
                $max = $max+1;
                array_shift($arr);
            }else if ($item == $max){//如果相等,就继续
                //FLAG_A
                array_shift($arr);
                //END_FLAG_A
            }else{//如果不连续,就输出当前结果,并进入下次迭代
                //FLAG_B
                if($max==$min){
                    $ret[] = "$min";
                }else{
                    $ret[] = "$min~$max";
                }

                if(!empty($arr)){
                    sortRange($arr,$ret);
                    return;
                }
                //END_FLAG_B
            }
        }
        //处理最后一次不进入铁代的情况
        if($max==$min){
            $ret[] = "$min";
        }else{
            $ret[] = "$min~$max";
        }
}
//调用方法
sortRange($arr,$ret);

//输出结果
print_r($ret);

如果你要把相同值展示出来,就把FLAG_A的代码,替换为iFLAG_B的代码

巴扎黑
  1. 強制類別轉換一維 array 的各元素;

  2. 排序;

  3. 檢測連續與否,並構造然輸出的 array。

天蓬老师

之前在segmentfault看到mysql有问这个查询语句的。
这道题应该接近O(n)吧,先桶排,然后循环一遍就行了

迷茫
$old_arr = [3, 1, 2, 4, 8, 7, 9, 10, 13, 15];

sort($old_arr);
$new_arr = [[]];
$i = 0;
foreach ($old_arr as $e) {
    if ($e - end($new_arr[$i]) > 1)
        $i++;
    $new_arr[$i][] = $e;

}

var_dump($new_arr);
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号