PHP-在一个对象中对相似键进行分组

PHP-在一个对象中对相似键进行分组,php,Php,我有一个包含对象的数组,如果已经存在类似的键,我希望实现的是将对象分组。我的JSON输出看起来是 [ { "id": 37, "slug": "red", "stock": true, "name": "Red", "default": 0, "sizes": "38" }, { "id": 38, "slug": "red", "stock": true, "name":

我有一个包含对象的数组,如果已经存在类似的键,我希望实现的是将对象分组。我的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"
  }
我想实现的是将相似的蛞蝓分组,并将所有大小的数组放在一个数组中。下面是这样的

[
{
  "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重新创建新的输出数组。