如何将json格式化为我需要的?

时间:2014-10-07 16:24:27

标签: php json formatting

好的,现在就把这个拿出来。我吮吸PHP。我正在构建一个角度应用程序,它将使用数据库中的数据填充移动应用程序。我从数据库中拉出来就好了,但我需要以特殊的方式格式化json,我不知道该怎么做。

使用json_encode这是它来自数据库的方式:

[
  {
    "id":"1",
    "date":"2014-10-03",
    "time":"2014-10-03 10:45:05",
    "amount":"5"
  },
  {
    "id":"2",
    "date":"2014-10-03",
    "time":"2014-10-03 12:21:05",
    "amount":"2"
  }
]

这就是我需要组织的方式(这只是在角度侧使用的虚拟数据)

  [
    {
      date: '2014-09-04',
      feeding: [
        {
          id: '1',
          time: '1409852728000',
          amount: '3'
        },
        {
          id: '2',
          time: '1409874328000',
          amount: '4'
        },
      ]
    },
    {
      date: '2014-09-05',
      feeding: [
        {
          id: '3',
          time: '1409915908000',
          amount: '3.5'
        },
        {
          id: '4',
          time: '1409957908000',
          amount: '5'
        },
      ]
    },
  ]

我需要分开并按日期分组。我该怎么做呢?

3 个答案:

答案 0 :(得分:1)

Airtech就在那里。但是对该功能的小更新。进给值需要是一个对象数组而不是一个对象。然后,您需要将单个对象推送到该数组中。

function dateparse($in) {
$in = json_decode($in);
$out = array();
for ($i = 0; $i < sizeof($in); $i++) {
    $date = $in[$i]->date;
    $isFound = false;
    for ($i2 = 0; $i2 < sizeof($out); $i2++) {
        if ($date == $out[$i2]["date"]) {
            // We've already run into this search value before
            // So add the the elements
            $isFound = true;
            $out[$i2]["feeding"][] = array(
                "id" => $in[$i]->id,
                "time" => $in[$i]->time,
                "amount" => $in[$i]->amount);
            break;
        }
    }
    if (!$isFound) {
        // No matches yet
        // We need to add this one to the array
        $feeding = array("id" => $in[$i]->id, "time" => $in[$i]->time, "amount" => $in[$i]->amount);
        $out[] = array("date" => $in[$i]->date, "feeding" => array($feeding));
    }
}
return json_encode($out);
}

答案 1 :(得分:0)

以下怎么样?我在你的json输入示例上测试了它,它运行正常。

function parse($in)
{
    $in = json_decode($in);
    $out = array();
    for ($i = 0; $i < sizeof($in); $i++) {
        $date = $in[$i]->date;
        $isFound = false;
        for ($i2 = 0; $i2 < sizeof($out); $i2++) {
            if ($date == $out[$i2]["date"]) {
                // We've already run into this search value before
                // So add the the elements
                $isFound = true;
                $out[$i2][]["feeding"] = array(
                    "id" => $in[$i]->id,
                    "time" => $in[$i]->time,
                    "amount" => $in[$i]->amount);
                break;
            }
        }
        if (!$isFound) {
            // No matches yet
            // We need to add this one to the array
            $out[] = array("date" => $in[$i]->date, "feeding" => array(
                    "id" => $in[$i]->id,
                    "time" => $in[$i]->time,
                    "amount" => $in[$i]->amount));
        }
    }
    return json_encode($out);
}

答案 2 :(得分:0)

这个怎么样?这工作正常,按预期工作:): -

function dateparse($var)
    {
        $counter=0; $var = json_decode($var); $date=array();
        foreach($var as $key=>$value){foreach($value as $val1=>$val2)
            {if($val1 == "date")
                {foreach($value as $val3=>$val4)
                        {if($val3!="date") //because we don't want date again
                            {
                            $date[$val2]["feeding"][$counter][$val3] = $val4; continue;
                            }}continue;
                }
        }$counter++;}
        return json_encode($date);}