如何从这个JSON响应创建新数组



我真的很难从这个响应创建一个新的数组,我不知道从哪里开始,也不知道如何开始:

{
"fruits": [
{
"name": "Bananas",
"pieces": 2469429
},
{
"name": "Oranges",
"pieces": 1576890
},
{
"name": "Lemons",
"pieces": 5645318
}
],
"size": [
{
"size": "5000-10,000 eaters",
"pieces": 17008533
},
{
"size": "100-500 eaters",
"pieces": 23473914
},
{
"size": "10,001+ eaters",
"pieces": 68086139
}
],
"SizeAndFruit": [
{
"size": "100-500 eaters",
"pieces": 226636,
"name": "Bananas"
},        
{
"size": "5000-10,000 eaters",
"pieces": 249004,
"name": "Bananas"
},
{
"size": "10,001+ eaters",
"pieces": 727829,
"name": "Bananas"
},
{
"size": "100-500 eaters",
"pieces": 416310,
"name": "Lemons"
},
{
"size": "5000-10,000 eaters",
"pieces": 488711,
"name": "Lemons"
},
{
"size": "10,001+ eaters",
"pieces": 2340652,
"name": "Lemons"
},
{
"size": "100-500 eaters",
"pieces": 217037,
"name": "Oranges"
},
{
"size": "5000-10,000 eaters",
"pieces": 71779,
"name": "Oranges"
},
{
"size": "10,001+ eaters",
"pieces": 201729,
"name": "Oranges"
}
]
}

我想得到这个新的结构/阵列:

{
"newArray": [
{
"name": "Bananas",
"totalResults": 2469429,
"sortedResults": [
{
"size": "100-500 eaters",
"pieces": 226636
},
{
"size": "5000-10,000 eaters",
"pieces": 249004
},
{
"size": "10,001+ eaters",
"pieces": 727829
}
]
},
{
"name": "Oranges",
"totalResults": 1576890,
"sortedResults": [
{
"size": "100-500 eaters",
"pieces": 217037
},
{
"size": "5000-10,000 eaters",
"pieces": 71779
},
{
"size": "10,001+ eaters",
"pieces": 201729
}
]
},
{
"name": "Lemons",
"totalResults": 5645318,
"sortedResults": [
{
"size": "100-500 eaters",
"pieces": 416310
},
{
"size": "5000-10,000 eaters",
"pieces": 488711
},
{
"size": "10,001+ eaters",
"pieces": 2340652
}
]
}
]
}

我如何让每个水果都从上面的例子中的sizeAndFruit添加所有大小的子数组?在那之后,每个水果都必须排在一张桌子上,这就是为什么我需要得到这个新的阵列?如果你有任何建议或任何额外的问题,请告诉我,如果需要,我很乐意解释更多。非常感谢!


为David编辑:如果我们总是按尺寸订购,怎么样?这是一个片段:pastecode.io/st82n19x4,所以当订单是这样的时候。因此,按照大卫的回复中的尺寸订购,因为如果这些是混合的,那么他们会按100-500 5001-10000 10000+的顺序订购,他们会按10.000+100-500 50011000等。非常感谢。

以下代码读取您的输入并将其转换为您想要的输出(包括按size排序(:

<?php
$inputContents = file_get_contents(__DIR__ . '/input.json');
$inputJson = json_decode($inputContents);
$out = [];
foreach ($inputJson->fruits as $fruit) {
$out[] = [
'name' => $fruit->name,
'totalResults' => $fruit->pieces,
'sortedResults' => [],
];
}
foreach ($inputJson->SizeAndFruit as $entry) {
$newEntry = [
'size' => $entry->size,
'pieces' => $entry->pieces,
];
foreach ($out as &$fruit) {
if ($fruit['name'] === $entry->name) {
$fruit['sortedResults'][] = $newEntry;
}
}
}
/**
* Get a number of the size from the provided string.
* 
* @param string $size
* 
* @return int|null
*/
function sizeStringToNumber(string $size): ?int
{
$sizes = [
'100-500 eaters' => 100,
'5000-10,000 eaters' => 5000,
'10,001+ eaters' => 10000,
];
if (isset($sizes[$size])) {
return $sizes[$size];
}
throw new Exception('Unknown size: ' . $size);
}
/**
* Sort the `sortedResults` array by `size` in ascending order.
*/
foreach ($out as &$fruit) {
usort($fruit['sortedResults'], function ($a, $b) {
$aSize = sizeStringToNumber($a['size']);
$bSize = sizeStringToNumber($b['size']);
return $aSize <=> $bSize;
});
}

$outArray = [
'newArray' => $out,
];
$outJson = json_encode($outArray, JSON_PRETTY_PRINT);
print_r($outJson);

打印为:

{
"newArray": [
{
"name": "Bananas",
"totalResults": 2469429,
"sortedResults": [
{
"size": "100-500 eaters",
"pieces": 226636
},
{
"size": "5000-10,000 eaters",
"pieces": 249004
},
{
"size": "10,001+ eaters",
"pieces": 727829
}
]
},
{
"name": "Oranges",
"totalResults": 1576890,
"sortedResults": [
{
"size": "100-500 eaters",
"pieces": 217037
},
{
"size": "5000-10,000 eaters",
"pieces": 71779
},
{
"size": "10,001+ eaters",
"pieces": 201729
}
]
},
{
"name": "Lemons",
"totalResults": 5645318,
"sortedResults": [
{
"size": "100-500 eaters",
"pieces": 416310
},
{
"size": "5000-10,000 eaters",
"pieces": 488711
},
{
"size": "10,001+ eaters",
"pieces": 2340652
}
]
}
]
}

最新更新