PHP-在一个对象中对相似键进行分组
我有一个包含对象的数组,如果已经存在类似的键,我希望实现的是将对象分组。我的JSON输出看起来是PHP-在一个对象中对相似键进行分组,php,Php,我有一个包含对象的数组,如果已经存在类似的键,我希望实现的是将对象分组。我的JSON输出看起来是 [ { "id": 37, "slug": "red", "stock": true, "name": "Red", "default": 0, "sizes": "38" }, { "id": 38, "slug": "red", "stock": true, "name":
[
{
"id": 37,
"slug": "red",
"stock": true,
"name": "Red",
"default": 0,
"sizes": "38"
},
{
"id": 38,
"slug": "red",
"stock": true,
"name": "Red",
"default": 0,
"sizes": "40"
},
{
"id": 34,
"slug": "red",
"stock": true,
"name": "Red",
"default": 0,
"sizes": "36"
},
{
"id": 26,
"slug": "green",
"stock": true,
"name": "Green",
"default": 0,
"sizes": "48"
}
我想实现的是将相似的蛞蝓分组,并将所有大小的数组放在一个数组中。下面是这样的
[
{
"slug": "red",
"name": "Red",
"sizes" : [{
"id": 37,
"slug": "red",
"stock": true,
"name": "Red",
"default": 0,
"sizes": "38"
},
{
"id": 38,
"slug": "red",
"stock": true,
"name": "Red",
"default": 0,
"sizes": "40"
},
{
"id": 34,
"slug": "red",
"stock": true,
"name": "Red",
"default": 0,
"sizes": "36"
}]
}, {
"slug": "green",
"name": "Green",
"sizes": [{
"id": 26,
"slug": "green",
"stock": true,
"name": "Green",
"default": 0,
"sizes": "48"
}]
}
]
我并不是一个PHP专家,所以我整天都在想如何进行搜索,希望精通PHP的人能帮我解决这个问题。你可以先用一个循环按slug对结果进行分组,然后用另一个循环得到你想要的结果。让我们这样试试-
<?php
$json = '[{"id":37,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"38"},{"id":38,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"40"},{"id":34,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"36"},{"id":26,"slug":"green","stock":true,"name":"Green","default":0,"sizes":"48"}]';
$array = json_decode($json,1);
$expected = [];
foreach($array as $v) {
$expected[$v['slug']][] = $v;
}
$expected_v2 = [];
foreach($expected as $k1=>$v1) {
array_push($expected_v2,['slug'=>$k1,'name'=>ucfirst($k1),'sizes'=>$v1]);
}
//print_r($expected_v2);
echo json_encode($expected_v2);
?>
演示:您可以先使用一个循环按slug对结果进行分组,然后使用另一个循环来获得所需的结果。让我们这样试试-
<?php
$json = '[{"id":37,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"38"},{"id":38,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"40"},{"id":34,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"36"},{"id":26,"slug":"green","stock":true,"name":"Green","default":0,"sizes":"48"}]';
$array = json_decode($json,1);
$expected = [];
foreach($array as $v) {
$expected[$v['slug']][] = $v;
}
$expected_v2 = [];
foreach($expected as $k1=>$v1) {
array_push($expected_v2,['slug'=>$k1,'name'=>ucfirst($k1),'sizes'=>$v1]);
}
//print_r($expected_v2);
echo json_encode($expected_v2);
?>
演示:您可以使用“array\u reduce”来实现这一点:
$json = '[{"id":37,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"38"},{"id":38,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"40"},{"id":34,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"36"},{"id":26,"slug":"green","stock":true,"name":"Green","default":0,"sizes":"48"}]';
$input = json_decode($json, true);
$output = array_reduce(array_reduce($input, function ($carry, $item) {
$carry[$item['slug']][] = $item;
return $carry;
}, []), function ($carry, $group) {
$carry[] = [
'slug' => $group[0]['slug'],
'name' => $group[0]['name'],
'sizes' => $group
];
return $carry;
}, []);
您可以使用“array\u reduce”来实现这一点:
$json = '[{"id":37,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"38"},{"id":38,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"40"},{"id":34,"slug":"red","stock":true,"name":"Red","default":0,"sizes":"36"},{"id":26,"slug":"green","stock":true,"name":"Green","default":0,"sizes":"48"}]';
$input = json_decode($json, true);
$output = array_reduce(array_reduce($input, function ($carry, $item) {
$carry[$item['slug']][] = $item;
return $carry;
}, []), function ($carry, $group) {
$carry[] = [
'slug' => $group[0]['slug'],
'name' => $group[0]['name'],
'sizes' => $group
];
return $carry;
}, []);
手动解析键/值对并从输入JSON重新创建新的输出数组。手动解析键/值对并从输入JSON重新创建新的输出数组。