PHP算法求解

查看:111
本文介绍了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 '<pre>';
var_export(foo($arr));

打印结果:

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

解决方案

看到这个问题,自己实现了哈,不是很优化,供参考

<?php
// +----------------------------------------------------------------------
// | lmxdawn [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016 .
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Byron Sampson <lmxdawn@gmail.com>
// +----------------------------------------------------------------------

/*
//设,有数组:
    $arr = [3, 1, 2, 4, 8, 7, 9, 10, 13, 15];
//写一个函数,使其输出格式为:
    $arr = array(
        0 => '1~4',
        1 => '7~10',
        2 => '13',
        3 => '15'
    );
 //*/

class Test {

    private $test_array;//需要操作的数组

    private $ico = '~';//分隔符

    private static $_instance;//

    private function __construct($test_array = array()) {
        $this->test_array = $test_array;
    }

    private function __clone() {
        // TODO: Implement __clone() method.
    }

    public static function getInstance($test_array = array()){
        if (is_null(self::$_instance) || !isset(self::$_instance)){
            self::$_instance = new self($test_array);
        }
        return self::$_instance;
    }

    /**
     * 数组分组
     * @return array 返回分好的数组
     */
    public function array_group(){

        //首先 升序对数组排序
        sort($this->test_array);
        // 去重数组
        $test_array = array_unique($this->test_array);
        //定义临时数组
        $tmp_array = array();
        $one = $test_array[0];//记录第一次的值
        $tmp_array_key = -1;//临时数组的下标 (初始值为 -1)不然临时数组的下标会从 1 开始
        foreach ($test_array as $key => $val){
            // 取出临时数组的最后一个元素
            $last_val = end($tmp_array);
            // 用分隔符把字符串转换为数组
            $last_array = explode($this->ico,$last_val);
            //如果最后一个元素为数组 就去最后一个元素的最后一个元素,否则就是取第一个
            $tmp_last_val = (is_array($last_array)) ? end($last_array) : $last_array[0];
            //判断是否是连续值
            if (!empty($tmp_last_val) && ($tmp_last_val + 1) == $val){
                $val = $one.$this->ico.$val;
            }else{
                // 如果不连续,更改第一次记录的值
                $one = $val;
                // 临时数组的值加一
                $tmp_array_key++;
            }
            //存入临数组
            $tmp_array[$tmp_array_key] = $val;
        }

        return $tmp_array;//返回临时数组

    }


    /**
     * 格式化输出数组
     * @param      $var
     * @param bool $echo
     * @param null $label
     * @param bool $strict
     * @return mixed|null|string
     */
    public static function dump($var, $echo=true, $label=null, $strict=true) {
        header("Content-type: text/html; charset=utf-8");
        $label = ($label === null) ? '' : rtrim($label) . ' ';
        if (!$strict) {
            if (ini_get('html_errors')) {
                $output = print_r($var, true);
                $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
            } else {
                $output = $label . print_r($var, true);
            }
        } else {
            ob_start();
            var_dump($var);
            $output = ob_get_clean();
            if (!extension_loaded('xdebug')) {
                $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
                $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
            }
        }
        if ($echo) {
            echo($output);
            return null;
        }else
            return $output;
    }

}

$test_array = array(3, 1, 2, 4, 8, 7, 9, 10, 13, 15,3,1,2,4,23,56,85,24);
$test = Test::getInstance($test_array);

// 打印数组
Test::dump($test->array_group());

结果 :

array(7) {
  [0] => string(3) "1~4"
  [1] => string(4) "7~10"
  [2] => int(13)
  [3] => int(15)
  [4] => string(5) "23~24"
  [5] => int(56)
  [6] => int(85)
}

这篇关于PHP算法求解的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆