首页 > 解决方案 > 如何在php中动态创建一个计数对象?

问题描述

我有这样的数据,

data: [{
      0: {
         id: 1
         name: aaa,
      }
      1: {
         id: 2
         name: bbb,
      }
      3: {
         id: 3
         name: ccc,
      }
      4: {
         id: 2
         name: bbb,
      }
      5: {
         id: 1
         name: aaa,
      }
      6: {
         id: 2
         name: bbb,
      }
}]

现在我想得到重复值的计数,我希望我的最终结果是这样的,

data: [{
      0: {
         id: 1
         name: aaa,
         count: 2
      }
      1: {
         id: 2
         name: bbb,
         count: 3
      }
      2: {
         id: 3
         name: ccc,
         count: 1
      }
    }]

我试过这段代码,

$loc = []
foreach ($data as $key) {
    if(array_key_exists($key->id,$loc)){
       $loc[$key->id] = $loc[$key->id] + 1;
    }else{
       $loc[$key->id] = 1;
    }
 }

它有效,但结果类似于,

{
 1: 2
 2: 3
 3: 1
}

但我想像上面提到的那样显示。帮助我正确获取数据格式。

标签: phparrayscount

解决方案


此代码将为您提供所需的基本结构:

$loc = [];
foreach ($data as $key) {
    if(array_key_exists($key->id,$loc)){
       $loc[$key->id]->count++;
    }else{
       $loc[$key->id] = clone $key;
       $loc[$key->id]->count = 1;
    }
}
print_r($loc);

输出:

Array
(
    [1] => stdClass Object
        (
            [id] => 1
            [name] => aaa
            [count] => 2
        )    
    [2] => stdClass Object
        (
            [id] => 2
            [name] => bbb
            [count] => 3
        )    
    [3] => stdClass Object
        (
            [id] => 3
            [name] => ccc
            [count] => 1
        )    
)

然后,您可以进行各种操作以获取类似于您在问题中显示的 JSON 的内容,例如

echo json_encode((object)['data' => [(object)array_values($loc)]], JSON_PRETTY_PRINT);

输出:

{
    "data": [
        {
            "0": {
                "id": 1,
                "name": "aaa",
                "count": 2
            },
            "1": {
                "id": 2,
                "name": "bbb",
                "count": 3
            },
            "2": {
                "id": 3,
                "name": "ccc",
                "count": 1
            }
        }
    ]
}

3v4l.org 上的演示


推荐阅读