首页 > 后端开发 > php教程 > php的数学题

php的数学题

WBOY
发布: 2016-06-06 20:29:53
原创
1444 人浏览过

我有一个数组,里面存的每一个都是一个年月日的日期的时间戳,
类似如下

<code>$data_arr = array(
    strtotime("2015-08-01"),
    strtotime("2015-08-02"),
    strtotime("2015-08-03"),
    strtotime("2015-08-04"),
    strtotime("2015-08-05"),
    strtotime("2015-08-07"),
    strtotime("2015-08-09"),
    strtotime("2015-08-10"),
    strtotime("2015-08-13")
);
</code>
登录后复制
登录后复制

这里面存放的是一个用户某一天没有交费。
现在希望能展示成

<code>2015-08-01 到 2015-08-05 未交费
2015-08-07 未交费
2015-08-09 到 2015-08-10 未交费
2015-08-13 未交费
</code>
登录后复制
登录后复制

类似的就是这个意思,
请问应该如何处理数组呢?

回复内容:

我有一个数组,里面存的每一个都是一个年月日的日期的时间戳,
类似如下

<code>$data_arr = array(
    strtotime("2015-08-01"),
    strtotime("2015-08-02"),
    strtotime("2015-08-03"),
    strtotime("2015-08-04"),
    strtotime("2015-08-05"),
    strtotime("2015-08-07"),
    strtotime("2015-08-09"),
    strtotime("2015-08-10"),
    strtotime("2015-08-13")
);
</code>
登录后复制
登录后复制

这里面存放的是一个用户某一天没有交费。
现在希望能展示成

<code>2015-08-01 到 2015-08-05 未交费
2015-08-07 未交费
2015-08-09 到 2015-08-10 未交费
2015-08-13 未交费
</code>
登录后复制
登录后复制

类似的就是这个意思,
请问应该如何处理数组呢?

上面那位朋友运行报了notice错误(数组越界),试试我的代码

<code><?php $data_arr = array(
    strtotime("2015-08-01"),
    strtotime("2015-08-03"),
    strtotime("2015-08-04"),
    strtotime("2015-08-05"),
    strtotime("2015-08-06"),
    strtotime("2015-08-07"),
    strtotime("2015-08-09"),
    strtotime("2015-08-10"),
    strtotime("2015-08-13"),
    strtotime("2015-08-14"),
    strtotime("2015-08-15"),
    strtotime("2015-08-19"),
    strtotime("2015-08-20"),
    strtotime("2015-08-22"),
);
array_push($data_arr, null);
        $start=null;
        for($i=1;$i<count($data_arr);$i++){
        if($data_arr[$i]==$data_arr[$i-1]+24*3600){
            if(!$start){
                $start=$data_arr[$i-1];
            }
        }else{
            if($start){
                echo date("Y-m-d",$start)."到".date("Y-m-d",$data_arr[$i-1])."未付款\n";
            }else{
                echo date("Y-m-d",$data_arr[$i-1])."未付款\n";
            }
            $start=null;
        }
        }
?></code>
登录后复制

献丑了

你的问题是一个数组里面保存着一些时间戳,你需要格式化一下这些数据对吧。我建议的方案:首先把时间戳转为具体日期年月日,分割年份,月份,日期出来组装好一个多维数组;然后日期间对比是否相邻,月份和年份对比则是最后一天和最早一天是否相邻,符合相邻条件的把数组连接起来组成新的数组,大概就这么一个思路,由于存在不同年不同月的情况,所以可能会复杂一点,大概需要写一个二次遍历才行,希望能帮到你…

先排序,再遍历一遍

先把时间全部转化成unix时间戳,然后对数组做一次数字升序排序.然后设置起始时间后,不断跟后一个数来比对,是否相差1天,如果是则不断更新对应的结束时间,如果否则设置结束时间,并另外设置一个新的起始时间,你复制下我的代码跑下,就明白了.顺带说下,这段代码至少要php5.4以上的版本才能跑通,短数组语法只从5.4开始支持.望采纳

<code class="php">$data_arr = array(
    strtotime("2015-08-01"),
    strtotime("2015-08-02"),
    strtotime("2015-08-03"),
    strtotime("2015-08-04"),
    strtotime("2015-08-05"),
    strtotime("2015-08-07"),
    strtotime("2015-08-09"),
    strtotime("2015-08-10"),
    strtotime("2015-08-13")
);
sort($data_arr);
$vars = [];//大致的数据是key若为奇数,则为开始时间,若key为偶数则为结束时间
$vars[] = $data_arr[0];//开始时间
for ($i=0;$i<count if continue else foreach as echo date></count>";
}</code>
登录后复制

前面一位朋友的程序运行了下,结果不是题主要的那种形式。请看我的程序。

<code><meta charset="utf-8">
<?php $data_arr = array(
    strtotime("2015-08-01"),
    strtotime("2015-08-03"),
    strtotime("2015-08-04"),
    strtotime("2015-08-05"),
    strtotime("2015-08-06"),
    strtotime("2015-08-07"),
    strtotime("2015-08-09"),
    strtotime("2015-08-10"),
    strtotime("2015-08-13"),
    strtotime("2015-08-14"),
    strtotime("2015-08-15"),
    strtotime("2015-08-19"),
    strtotime("2015-08-20"),
    strtotime("2015-08-22"),
);
for ($i = 0; $i < count($data_arr); $i++) {
    if ($data_arr[$i - 1] + 24 * 3600 == $data_arr[$i] && $data_arr[$i + 1] - 24 * 3600 != $data_arr[$i]) {
        $end = $data_arr[$i];
        echo date("Y-m-d", $start) . "到" . date("Y-m-d", $end) . "未交费<br>";
    } 
    if ($data_arr[$i + 1] - 24 * 3600 == $data_arr[$i] && $data_arr[$i - 1] + 24 * 3600 != $data_arr[$i]) {
        $start = $data_arr[$i];
    }
    if ($data_arr[$i + 1] - 24 * 3600 != $data_arr[$i] && $data_arr[$i - 1] + 24 * 3600 != $data_arr[$i]) {
        echo date("Y-m-d", $data_arr[$i]) . "未交费<br>";
    }
}
?></code>
登录后复制

运行结果

<code>2015-08-01未交费
2015-08-03到2015-08-07未交费
2015-08-09到2015-08-10未交费
2015-08-13到2015-08-15未交费
2015-08-19到2015-08-20未交费
2015-08-22未交费</code>
登录后复制
相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板