使用PHP循环JSON并生成嵌套JSON的新格式

使用PHP循环JSON并生成嵌套JSON的新格式,php,arrays,json,key,Php,Arrays,Json,Key,在PHP中,如何循环使用以下JSON对象的日期键,如果日期值相同,则合并时间: [ { date: "27-06-2017", time: "1430" }, { date: "27-06-2017", time: "1500" }, { date: "28-06-2017", time: "0930" }, { date: "28-06-2017", time: "0915" } ] 结果应该如

在PHP中,如何循环使用以下JSON对象的日期键,如果日期值相同,则合并时间:

[
  {
    date: "27-06-2017",
    time: "1430"
  },
  {
    date: "27-06-2017",
    time: "1500"
  },
  {
    date: "28-06-2017",
    time: "0930"
  },
  {
    date: "28-06-2017",
    time: "0915"
  }
] 
结果应该如下所示:

[
  {
    date: "27-06-2017",
    time: [{"1430","1500"}]
  },      {
    date: "28-06-2017",
    time: [{"0930, 0915"}]
  }
] 
我应该创建一个空数组,然后通过JSON循环并重新创建一个新的JSON吗?有没有更好的方法或解决方案可供参考

谢谢大家!

请尝试以下操作:

$a = [] // Your input array
$op= [];//output array
foreach($a as $key => $val){
    $key = $val['date'];
    $op[$key][] = $val['time'];
}
$op2 = [];
foreach($op as $key => $val){
    $op2[] = ['date' => $key, 'time' => $val]; 
}
请试试这个:

$a = [] // Your input array
$op= [];//output array
foreach($a as $key => $val){
    $key = $val['date'];
    $op[$key][] = $val['time'];
}
$op2 = [];
foreach($op as $key => $val){
    $op2[] = ['date' => $key, 'time' => $val]; 
}

另一个方法是

<?php
    $string = '[{"date": "27-06-2017","time": "1430"},{"date": "27-06-2017","time": "1500"},{"date": "28-06-2017","time": "0930"},{"date": "28-06-2017","time": "0915"}]';
    $arrs = json_decode($string);
    $main = array();
    $temp = array();
    foreach($arrs as $arr){
      if(in_array($arr->date,$temp)){
        $main[$arr->date]['time'][] = $arr->time;
      }else{
        $main[$arr->date]['date'] = $arr->date;
        $main[$arr->date]['time'][] = $arr->time;
        $temp[] = $arr->date;
      }
    }
    echo json_encode($main);
?>


现场演示:

另一个方法是

<?php
    $string = '[{"date": "27-06-2017","time": "1430"},{"date": "27-06-2017","time": "1500"},{"date": "28-06-2017","time": "0930"},{"date": "28-06-2017","time": "0915"}]';
    $arrs = json_decode($string);
    $main = array();
    $temp = array();
    foreach($arrs as $arr){
      if(in_array($arr->date,$temp)){
        $main[$arr->date]['time'][] = $arr->time;
      }else{
        $main[$arr->date]['date'] = $arr->date;
        $main[$arr->date]['time'][] = $arr->time;
        $temp[] = $arr->date;
      }
    }
    echo json_encode($main);
?>

现场演示:

“final”数组最初是使用基于日期的索引创建的,这样您就可以确定是否设置了这些索引,以允许您操作正确的“time”数组

最后,通过将
$final
放入
array\u values()
中以获得您要查找的零索引数组,就可以删除它们

json\u encode($final)
将提供您想要的json格式:

[{"date":"27-06-2017","time":["1430","1500"]},{"date":"28-06-2017","time":["0930","0915"]}]
“final”数组最初是使用基于日期的索引创建的,这样您就可以确定是否设置了这些索引,以允许您操作正确的“time”数组

最后,通过将
$final
放入
array\u values()
中以获得您要查找的零索引数组,就可以删除它们

json\u encode($final)
将提供您想要的json格式:

[{"date":"27-06-2017","time":["1430","1500"]},{"date":"28-06-2017","time":["0930","0915"]}]

此解决方案有点开销,但如果您确定数据是顺序的和排序的,则可以使用和:


这是。

此解决方案有点开销,但如果您确定数据是连续的和排序的,则可以使用和:

下面是另一个解决方案:

$d = [];
$dizi = array_map(function ($value) use (&$d) {
    if (array_key_exists($value->date, $d)) {
        array_push($d[$value->date]['time'], $value->time);
    } else {
        $d[$value->date] = [
            'date' => $value->date,
            'time' => [$value->time]
        ];
    }
}, $array);
echo json_encode(array_values($d));
另一个解决方案:

$d = [];
$dizi = array_map(function ($value) use (&$d) {
    if (array_key_exists($value->date, $d)) {
        array_push($d[$value->date]['time'], $value->time);
    } else {
        $d[$value->date] = [
            'date' => $value->date,
            'time' => [$value->time]
        ];
    }
}, $array);
echo json_encode(array_values($d));


我认为时间将是一个数组,而不是一个包含格式不好的对象的数组。我建议您先阅读json手册。我想你应该有这样一个输出:[{日期:“27-06-2017”,时间:[“1430”,“1500”]}]谢谢你指出这一点,它很有意义。如果你有大数据,你可以检查if-else条件和一些find函数,或者你可以用检查两列这样简单的方法来做我认为时间将是一个数组,不是包含格式不正确的对象的数组。我建议您先阅读json手册。我想你应该有这样一个输出:[{日期:“27-06-2017”,时间:[“1430”,“1500”]}]谢谢你指出这一点,如果你有大数据,你可以用if-else条件和一些find函数进行检查,或者你可以用检查两列这样的简单方法进行检查这不是解决方案答案很好,但是有没有办法像@Marius Bogdan建议的那样使用键值对?[{日期:“27-06-2017”,时间:[“1430”,“1500”]}]感谢您的快速回答,认为第二个foreach中的$op[]是$op2[]。所以我必须使用2 foreach循环?如果数据量很大,它可能没有那么有效,对吗?第二个foreach应该是:foreach($op as$key=>$val){$op2[]=['date'=>$key,'time'=>$val];}这不是解决方案答案是好的,但有没有办法让键值对像@Marius Bogdan建议的那样?[{日期:“27-06-2017”,时间:[“1430”,“1500”]}]感谢您的快速回答,认为第二个foreach中的$op[]是$op2[]。所以我必须使用2 foreach循环?如果数据量很大,它可能没有那么有效,对吗?第二个foreach应该是:foreach($op as$key=>$val){$op2[]=['date'=>$key,'time'=>$val];}这个看起来不错!通过添加echo json_encode($grouped);我可以得到我想要的结果。让我在两天内测试一下,比较一下foreach的速度。谢谢这个看起来不错!通过添加echo json_encode($grouped);我可以得到我想要的结果。让我在两天内测试一下,比较一下foreach的速度。谢谢在经历了几个解决方案之后,我发现这一个更容易理解,并且只使用1 for循环。非常感谢大家的回答!!!抱歉,我喜欢这个答案,但格式与我所问的略有不同。在浏览了几个解决方案后,我发现这一个更容易理解,并且只使用了1 for循环。非常感谢大家的回答!!!对不起,我喜欢这个答案,但是格式和我问的略有不同。