修改数组json格式


Modify array json format

我有两个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"

我该如何更正?

也许您需要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);

其中一个问题是您尝试自己创建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"]
}
}