修改数组json格式

时间:2016-01-06 21:13:14

标签: php json

我有两个json数组,一个与另一个不同。 我需要打开这个数组:

{
    "medidas": [
        {
            "desc_medida": "OMBROS",
            "tamanho": "G",
            "valor": 63
        },
        {
            "desc_medida": "OMBROS",
            "tamanho": "GG",
            "valor": 64
        },
        {
            "desc_medida": "OMBROS",
            "tamanho": "M",
            "valor": 62
        },
        {
            "desc_medida": "OMBROS",
            "tamanho": "P",
            "valor": 60
        },
        {
            "desc_medida": "BUSTO",
            "tamanho": "G",
            "valor": 110
        },
        {
            "desc_medida": "BUSTO",
            "tamanho": "GG",
            "valor": 114
        },
        {
            "desc_medida": "BUSTO",
            "tamanho": "M",
            "valor": 104
        },
        {
            "desc_medida": "BUSTO",
            "tamanho": "P",
            "valor": 100
        },
        {
            "desc_medida": "CINTURA",
            "tamanho": "G",
            "valor": 110
        },
        {
            "desc_medida": "CINTURA",
            "tamanho": "GG",
            "valor": 114
        },
        {
            "desc_medida": "CINTURA",
            "tamanho": "M",
            "valor": 104
        },
        {
            "desc_medida": "CINTURA",
            "tamanho": "P",
            "valor": 100
        },
        {
            "desc_medida": "COMPRIMENTO",
            "tamanho": "G",
            "valor": 97
        },
        {
            "desc_medida": "COMPRIMENTO",
            "tamanho": "GG",
            "valor": 98
        },
        {
            "desc_medida": "COMPRIMENTO",
            "tamanho": "M",
            "valor": 96
        },
        {
            "desc_medida": "COMPRIMENTO",
            "tamanho": "P",
            "valor": 95
        }
    ]
}

采用以下格式:

{
    "header": ["TAMANHO", "OMBROS", "BUSTO", "CINTURA", "COMPRIMENTO"],
    "rows": {
        "P":  ["P", "60 cm", "100 cm", "100 cm", "95 cm"],
        "M":  ["M", "62 cm", "104 cm", "104 cm", "96 cm"],
        "G":  ["G", "63 cm", "110 cm", "110 cm", "97 cm"],
        "GG": ["GG", "64 cm", "114 cm", "114 cm", "98 cm"]
    }
}

我需要用PHP来做这件事。我做了很多测试,但无法得到结果。

这是我的尝试:

$j = json_decode($json,true);

$count = count($j['medidas']);
$descArray = array();
$rowArray = array();
$header = '{ "header":[';
$rows = '"rows":{';

/* MONTA O HEADER */
for($i = 0; $i < $count; $i ++){
    $descArray[$i] = $j['medidas'][$i]['desc_medida'];
}
$descArray = array_values(array_unique($descArray));
array_unshift($descArray, "TAMANHO");

$count = count($descArray);
for($i = 0; $i < $count; $i++){
    $header .= '"'.$descArray[$i].'",';
}
$header = substr($header,0,-1) . '],';

/* MONTA A ROW */
for($i = 0; $i < $count; $i ++){
    for($a = 0; $a < count($j['medidas'][$i]); $a++){
        $rows .= '"'.$j['medidas'][$i]['tamanho'].'"';
    }
}

echo $header.$rows;

echo "<pre>";
print_r($j);
echo "</pre>";

它给了我这个输出,这不好:

{ "header":["TAMANHO","OMBROS","BUSTO","CINTURA","COMPRIMENTO"],
  "rows":{"G""G""G""GG""GG""GG""M""M""M""P""P""P""G""G""G"

我该如何纠正?

2 个答案:

答案 0 :(得分:1)

也许你需要stdClass

$example_object = new stdClass();
$example_object->name = "Name";
$example_object->jobtitle = "Developer";
$example_object->arr = ['arrval1', 'arrval2'];

$json_data = json_encode($example_object);
print_r($json_data);

打印 {"name":"Joe Bloggs","jobtitle":"Developer","arr":["arrval1","arrval2"]}

UPD:

$descs = [];
$sizes = [];

foreach($json->medidas as $medida)
{
    $header = $medida->desc_medida;
    $size = $medida->tamanho;
    $size_value = $medida->valor;

    $descs[$header] = 1;
    $sizes[$size]['sizes'][] = $size_value . " cm";
}

$object = new stdClass;
$object->header = array_keys($descs);
$object->rows = new stdClass;

foreach (array_keys($sizes) as $size) {
    $object->rows->$size = array_merge([$size], $sizes[$size]['sizes']);
}


echo json_encode($object);

答案 1 :(得分:1)

其中一个问题是您尝试自己创建JSON格式,如果您首先创建真实对象(或数组)结构然后在其上调用json_encode,则可以更轻松地完成。

以下是可以完成工作的代码:

function transformJSON($inputJSON) {
    $input = json_decode($inputJSON);
    $output =  array(
        "header" => array("TAMANHO"),
        "rows" =>  array()
    );

    foreach ($input->medidas as $obj) {
        if (!in_array($obj->desc_medida, $output["header"])) {
            // add name to header
            $output["header"][] = $obj->desc_medida;
        }
        // add value to the right row
        $output["rows"][$obj->tamanho][] = $obj->valor . " cm";
    }
    // insert "GG" as first value in "GG" row, etc...
    foreach ($output["rows"] as $entry => $values) {
        array_unshift($output["rows"][$entry], $entry);
    }
    return json_encode($output);
}

与此示例数据一起使用:

$inputJSON = '{
"medidas": [
{
        "desc_medida": "OMBROS",
        "tamanho": "G",
        "valor": 63
},
{
        "desc_medida": "OMBROS",
        "tamanho": "GG",
        "valor": 64
},
{
        "desc_medida": "OMBROS",
        "tamanho": "M",
        "valor": 62
},
{
        "desc_medida": "OMBROS",
        "tamanho": "P",
        "valor": 60
},
{
        "desc_medida": "BUSTO",
        "tamanho": "G",
        "valor": 110
},
{
        "desc_medida": "BUSTO",
        "tamanho": "GG",
        "valor": 114
},
{
        "desc_medida": "BUSTO",
        "tamanho": "M",
        "valor": 104
},
{
        "desc_medida": "BUSTO",
        "tamanho": "P",
        "valor": 100
},
{
        "desc_medida": "CINTURA",
        "tamanho": "G",
        "valor": 110
},
{
        "desc_medida": "CINTURA",
        "tamanho": "GG",
        "valor": 114
},
{
        "desc_medida": "CINTURA",
        "tamanho": "M",
        "valor": 104
},
{
        "desc_medida": "CINTURA",
        "tamanho": "P",
        "valor": 100
},
{
        "desc_medida": "COMPRIMENTO",
        "tamanho": "G",
        "valor": 97
},
{
        "desc_medida": "COMPRIMENTO",
        "tamanho": "GG",
        "valor": 98
},
{
        "desc_medida": "COMPRIMENTO",
        "tamanho": "M",
        "valor": 96
},
{
        "desc_medida": "COMPRIMENTO",
        "tamanho": "P",
        "valor": 95
}
]
}';

你会这样称呼:

$outputJSON = transformJSON($inputJSON);
echo $outputJSON;

输出如您所述:

{
"header":["TAMANHO","OMBROS","BUSTO","CINTURA","COMPRIMENTO"],
"rows":{
"P":["P","60 cm","100 cm","100 cm","95 cm"],
"M":["M","62 cm","104 cm","104 cm","96 cm"],
"G":["G","63 cm","110 cm","110 cm","97 cm"],
"GG":["GG","64 cm","114 cm","114 cm","98 cm"]
}
}