PHP根据日期拆分数组

原数组类似为:根据supplierid和date值拆分,先判断supplierid值是否相同,如相同则判断date值是否连续,如连续则放进同一数组(即值相同且值连续则拆分... 原数组类似为:根据supplierid和date值拆分,先判断supplierid值是否相同,如相同则判断date值是否连续,如连续则放进同一数组(即值相同且值连续则拆分进同一数组,否则拆分至新数组)
Array
(
[0] => Array
(
[date] => 2013-08-15
[supplierid] => 208
)

[1] => Array
(
[date] => 2013-08-16
[supplierid] => 1252
)

[2] => Array
(
[date] => 2013-08-17
[supplierid] => 1252
)

[3] => Array
(
[date] => 2013-08-18
[supplierid] => 1252
)

[4] => Array
(
[date] => 2013-08-19
[supplierid] => 208
)

)

拆分后结果类似为
Array
(
[0] => Array
(
[date] => 2013-08-15
[supplierid] => 208
)
)

Array
(
[0] => Array
(
[date] => 2013-08-19
[supplierid] => 208
)
)

Array
(
[0] => Array
(
[date] => 2013-08-16
[supplierid] => 1252
)

[1] => Array
(
[date] => 2013-08-17
[supplierid] => 1252
)

[2] => Array
(
[date] => 2013-08-18
[supplierid] => 1252
)
)
请问如何实现?
展开
 我来答
百度网友cb4985820
2013-08-06 · TA获得超过562个赞
知道小有建树答主
回答量:250
采纳率:0%
帮助的人:254万
展开全部
 <?php
$test=array(array("date" => "2013-08-15","supplierid" => 208),
      array("date" => "2013-08-17","supplierid" => 1252),
   array("date" => "2013-08-16","supplierid" => 1252),
   array("date" => "2013-08-18","supplierid" => 1252),
   array("date" => "2013-08-19","supplierid" => 208));
$arr=array();
//按 supplierid 进行分组
foreach($test as $data){
 $arr[$data["supplierid"]][]=$data["date"];
}
$result=array();
$k=0;
foreach($arr as $key=>$new){ 
 sort($new);//对日期数组进行排序

 $i=0;
 foreach($new as $child_key=>$data){
  //按日期进行分组
  if($child_key){
   $p=strtotime($new[$child_key])-strtotime($new[$child_key-1]);//连续性判断
   if($p!="86400")
    $k++;
  }
  $result[$k][$i]["date"]=$key;
  $result[$k][$i]["supplierid"]=$data;
  $i++;
 }
 $k++; 
}
print_r($result);
?>
//给你个最精简的
//给你写这段代码花咯10多分钟,一句话都没有?你选择的那段代码是有逻辑错误的,日期差判断有误
yu641150278
推荐于2016-03-08 · TA获得超过1069个赞
知道小有建树答主
回答量:637
采纳率:100%
帮助的人:339万
展开全部
$new_arr = array();
$k = 0;
foreach($arr as $v){
    if(count($new_arr)==0){
        $new_arr[$k][]=$v;
    }else{
        $date = intval(str_replace("-","",$v['date']));                //把时间去掉-并转换为整型
        $flag = 0;                    //表示在该循环中是否有满足项
        foreach($new_arr as $key=>$arr){
            foreach($arr as $nv){
                if($v['supplierid']==$nv['supplierid']){
                    $ndate = intval(str_replace("-","",$nv['date']));
                    if(abs($ndate-$date)==1){
                        $flag = 1;
                        $new_arr[$key][]=$v;
                    }
                }else{
                    break;        //终止本循环
                }
            }
        }
        if($flag==0){                //如果在现有的数组中没有满足项,则新增一项
            $k++;
            $new_arr[$k][]=$v;
        }
    }
}
print_r($new_arr);

额,循环的有点多,我测试了一下好像可以做出来。再找找更优化的方法吧

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-06
展开全部
$array = array(
    '0' => array (
            'date' => '2013-08-15',
            'supplierid' => '208'
        ),
    '1' => array (
            'date' => '2013-08-16',
            'supplierid' => '1252'
        ),
    '2' => array (
            'date' => '2013-08-17',
            'supplierid' => '1252'
        ),
    '3' => array(
        'date' => '2013-08-18',
        'supplierid' => '111'
    ),
    '4' => array(
        'date' => '2013-08-19',
        'supplierid' => '111'
    )
);
function unique_arr($array,$field = 'supplierid'){
    $list = $temp = array();
    if(!empty($array) && is_array($array)){
        foreach ($array as $v){
            $v = $v[$field];
            $temp[] = $v;
        }
        $temp = array_unique($temp);
        foreach ($temp as $k => $v){
            $list[] = $array[$k];
        }
    }
    return $list;
}
echo '<pre>';
print_r(unique_arr($array));
exit;
写完之后我发现我够无聊的....
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
房琨瑶07n
2013-08-06 · TA获得超过121个赞
知道小有建树答主
回答量:174
采纳率:0%
帮助的人:114万
展开全部
function two_array_sort($arr,$feild)//如果原来的日期没按照日期排好重新排序
{
$val=array();
foreach ($arr as $k=>$v)
{
$val[]=$v[$feild];
}
array_multisort($val, SORT_DESC, $arr);
return $arr;
}
$new_arr=array();
foreach ($arr as $k=>$v)
{
$new_arr[$v['supplierid']][]=$v;
};
$get_arr=array();
foreach ($new_arr as $k=>$v)
{
if(count($v)>1)
{
$sort_arr=two_array_sort($v, 'date');
$num= count($sort_arr);
foreach ($sort_arr as $k=>$v)
{
if($k!=$num-1){
$tem=$k+1;

$x=strtotime($v['date'])-strtotime($sort_arr[$tem]['date']);

if($x!=86400)
{
$get_arr[]=$sort_arr[$k];
unset($sort_arr[$k]);
}
}
}
$get_arr[]=$sort_arr;

}else
{
$get_arr[]=$v;
}
}
echo "<pre>";
print_r($get_arr);echo "</pre>";
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chinalande
2013-08-06 · 超过79用户采纳过TA的回答
知道小有建树答主
回答量:397
采纳率:0%
帮助的人:113万
展开全部
使用数据库的group 功能
自己编程稍有点麻烦
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式