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

How can I create new array from this JSON response?

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

{
    "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"
        }
    ]
}

我想要这个新的 structure/array:

{
    "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 添加所有尺寸作为子数组?之后每个水果都必须排成 table,这就是为什么我需要得到这个新数组?如果您有任何建议或任何其他问题,请告诉我,如果需要,我很乐意解释更多。非常感谢!


为大卫编辑: 如果我们总是按尺寸订购它们怎么样? 这是代码片段:pastecode.io/s/t82n19x4 所以当订单是这样的。因此,要按 David 回复中现在的尺寸来订购它们,因为如果这些是混合的,那么它们会按原样订购,而不是 100-500 5001-10000 10,000+ 它们会变成 10.000+ 100-500 5001-1000,等等。 谢谢!

以下代码读取您的输入并将其转换为您想要的输出(包括按 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
                }
            ]
        }
    ]
}