我有两个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"
我该如何纠正?
答案 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"]
}
}