如何转换现有的JSON输出,使其与所需格式匹配

时间:2019-04-07 19:48:24

标签: php arrays json

我有一个来自json存储过程的mysql输出。一切正常,但是我需要将json输出转换为其他所需格式。

我的json如下所示(这是在json_encode查询中简单的mysql的结果):

[
    {
        "stack": monday,
        "name": "banana",
        "i_value_p": "1.1",
        "i_value_n": "2.9",
        "i_value_u": "0.0"
    },
    {
        "stack": monday,
        "name": "apple",
        "i_value_p": "1.5",
        "i_value_n": "3.9",
        "i_value_u": "0.0"
    },
    {
        "stack": monday,
        "name": "grape",
        "i_value_p": "1.1",
        "i_value_n": "3.1",
        "i_value_u": "0.0"
    },
    {
        "stack": wednesday,
        "name": "banana",
        "i_value_p": "2.4",
        "i_value_n": "6.0",
        "i_value_u": "0.0"
    },
    {
        "stack": wednesday,
        "name": "apple",
        "i_value_p": "3.0",
        "i_value_n": "7.6",
        "i_value_u": "0.0"
    },
    {
        "stack": wednesday,
        "name": grape",
        "i_value_p": "2.3",
        "i_value_n": "6.0",
        "i_value_u": "0.0",
        "fill_color": "#0B62A4"
    },
    {
        "stack": friday,
        "name": "banana",
        "i_value_p": "2.2",
        "i_value_n": "6.5",
        "i_value_u": "0.0"
    },
    {
        "stack": friday,
        "name": "apple",
        "i_value_p": "3.0",
        "i_value_n": "7.9",
        "i_value_u": "0.0"
    },
    {
        "stack": friday,
        "name": "grape",
        "i_value_p": "2.0",
        "i_value_n": "5.4",
        "i_value_u": "0.0"
    }
]

我想要的是以下json输出:

[
    {
        name: "i_value_p",
        data: [1.1, 1.5, 1.1,], //banana, apple, grape
        stack: "monday"
    }, 
    {
        name: "i_value_n",
        data: [2.9, 3.9, 2.1], //banana, apple, grape
        stack: "monday"
    }, 
    {
        name: 'i_value_u',
        data: [0.0, 0.0, 0.0], //banana, apple, grape
        stack: "monday"
    }

// and the same goes for the wednesday and friday

]

在我的查询中,i_value_pi_value_ni_value_u始终是固定的列,不会改变。水果的天数和天数可能会有所不同。

现在我的问题是:在php中,如何将mysql的输出转换为array,它(在执行json_encode之后)会为我提供所需的{ {1}}输出。

我对json查询的php代码:

mysql

我已经开始做某件事,但是我无法弄清楚:

$stmt = $dbdto->prepare("CALL testSO(?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param('iiiiissi', $val1, $val2, $val3, $val4, $val5, $val6, $vl7, $val8);
$stmt->execute();
$result = $stmt->get_result();

$data = array();
while ( $row = $result->fetch_assoc() ) {
  $data[] = $row;
}

echo json_encode($data, JSON_PRETTY_PRINT);

(显然)这还没有给我任何结果。

对此有何想法?

2 个答案:

答案 0 :(得分:2)

    <?php
    $json = '[
                {
                    "stack": "monday",
                    "name": "banana",
                    "i_value_p": "1.1",
                    "i_value_n": "2.9",
                    "i_value_u": "0.0"
                },
                {
                    "stack": "monday",
                    "name": "apple",
                    "i_value_p": "1.5",
                    "i_value_n": "3.9",
                    "i_value_u": "0.0"
                },
                {
                    "stack": "monday",
                    "name": "grape",
                    "i_value_p": "1.1",
                    "i_value_n": "3.1",
                    "i_value_u": "0.0"
                },
                {
                    "stack": "wednesday",
                    "name": "banana",
                    "i_value_p": "2.4",
                    "i_value_n": "6.0",
                    "i_value_u": "0.0"
                }
            ]';

    $data = json_decode($json);
    $arr = ["i_value_p", "i_value_n", "i_value_u"];

    $row_array = array();
    foreach ($data as $item => $obj) {
        $row_array[$obj->stack]['i_value_p'][] = $obj->i_value_p;
        $row_array[$obj->stack]['i_value_n'][] = $obj->i_value_n;
        $row_array[$obj->stack]['i_value_u'][] = $obj->i_value_u;
    }

    $newdata = array();
    foreach ($row_array as $stack => $values) {
        foreach ($values as $key => $value) {
            $newdata[] = array(
                'stack' => $stack,
                'data' => $value,
                'name' => $key,
            );
        }
    }

    print(json_encode($newdata));

答案 1 :(得分:1)

我敢肯定有解决问题的简便方法。这可能对您有帮助,不确定所需的输出是否可能是您想要的输出。如果没有,您可以设计类似的产品。

原始输入

$data = '[
    {
        "stack": "monday",
        "name": "banana",
        "i_value_p": "1.1",
        "i_value_n": "2.9",
        "i_value_u": "0.0"
    },
    {
        "stack": "monday",
        "name": "apple",
        "i_value_p": "1.5",
        "i_value_n": "3.9",
        "i_value_u": "0.0"
    },
    {
        "stack": "monday",
        "name": "grape",
        "i_value_p": "1.1",
        "i_value_n": "3.1",
        "i_value_u": "0.0"
    },
    {
        "stack": "wednesday",
        "name": "banana",
        "i_value_p": "2.4",
        "i_value_n": "6.0",
        "i_value_u": "0.0"
    },
    {
        "stack": "wednesday",
        "name": "apple",
        "i_value_p": "3.0",
        "i_value_n": "7.6",
        "i_value_u": "0.0"
    },
    {
        "stack": "wednesday",
        "name": "grape",
        "i_value_p": "2.3",
        "i_value_n": "6.0",
        "i_value_u": "0.0",
        "fill_color": "#0B62A4"
    },
    {
        "stack": "friday",
        "name": "banana",
        "i_value_p": "2.2",
        "i_value_n": "6.5",
        "i_value_u": "0.0"
    },
    {
        "stack": "friday",
        "name": "apple",
        "i_value_p": "3.0",
        "i_value_n": "7.9",
        "i_value_u": "0.0"
    },
    {
        "stack": "friday",
        "name": "grape",
        "i_value_p": "2.0",
        "i_value_n": "5.4",
        "i_value_u": "0.0"
    }
]'; //original JSON

脚本

newData(json_decode($data, true)); // call newData function

function newData($data)
{

    $newData = array(); // new array
    $helper_array = array('p', 'n', 'u'); // different chars
    $c = 0; // counter to 3
    for ($i = 0; $i < sizeof($data); $i++) {
        array_push($newData, array(
            'data' => array(
                (float) $data[$i * $c]["i_value_" . $helper_array[$c]],
                (float) $data[$i * $c + 1]["i_value_" . $helper_array[$c]],
                (float) $data[$i * $c + 2]["i_value_" . $helper_array[$c]],
            ),
            'stack' => $data[$i]["stack"],
            'name' => array_search($data[$i]["i_value_" . $helper_array[$c++]], $data[$i]),
        ));
        if ($c === 3) {$c = 0;} // once $c reaches to 3, it would set it back to zero
    }

    //var_dump(json_encode($newData)); //view desired output

    return json_encode($newData);
}

所需的输出

[
  {
    "data": [
      1.1,
      1.5,
      1.1
    ],
    "stack": "monday",
    "name": "i_value_p"
  },
  {
    "data": [
      3.9,
      3.1,
      6
    ],
    "stack": "monday",
    "name": "i_value_n"
  },
  {
    "data": [
      0,
      0,
      0
    ],
    "stack": "monday",
    "name": "i_value_u"
  },
  {
    "data": [
      1.1,
      1.5,
      1.1
    ],
    "stack": "wednesday",
    "name": "i_value_p"
  },
  {
    "data": [
      7.6,
      6,
      6.5
    ],
    "stack": "wednesday",
    "name": "i_value_n"
  },
  {
    "data": [
      0,
      0,
      0
    ],
    "stack": "wednesday",
    "name": "i_value_u"
  },
  {
    "data": [
      1.1,
      1.5,
      1.1
    ],
    "stack": "friday",
    "name": "i_value_p"
  },
  {
    "data": [
      7.9,
      5.4,
      0
    ],
    "stack": "friday",
    "name": "i_value_n"
  },
  {
    "data": [
      0,
      0,
      0
    ],
    "stack": "friday",
    "name": "i_value_u"
  }
]