循环数组和if键值存在时为结构化数组添加1

时间:2017-01-20 23:14:44

标签: php mysql arrays json count

我有一个MySQL结果,在json中看起来如下

[
   {
      industry: "Building",
      province: "Gauteng",
      status: "review"
   },
   {
      industry: "Building",
      province: "Gauteng",
      status: "sent"
   },
   {
      industry: "Air Conditioning",
      province: "Cape Town",
      status: "free"
   }
]

我尝试获取此结果并生成一个如下所示的数组

{
   Gauteng: {
      Building: {
         sold: 2,
         free: 0
      },
   },
   Cape Town: {
      Air Conditioning: {
          sold: 0,
          free: 1
      }
   }
}

项目按省和行业分组,阵列的最后一级需要包含2个键"已销售" &安培; "自由&#34 ;.已售出被归类为已发送或评论的任何内容,免费是任何状态为免费的内容。

我的问题是我可以使数组到省>行业不知道如何检查和累计出售和免费的所有价值。

这是我目前使用的代码。

$query = DB::select("SELECT industry, province, status FROM messages WHERE MONTH(updated_at) = MONTH(CURDATE())");

$result = array();

    foreach($query as $item) {
      $result[$item->province][$item->industry] = array(
        "sold" => 12,
        "free" => 23
      );
    }

    echo json_encode($result);

给了我上面的结果。

提前感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

使用您现有的MySQL查询,我相信这实现了您想要的目标:

foreach($query as $item) {
        if(empty($result[$item->province][$item->industry])){
            $result[$item->province][$item->industry] = array(
                "sold" => 0,
                "free" => 0
            );
        }
        switch($item->status){
            case('free'):
                $result[$item->province][$item->industry]['free']++;
                break;
            case('sent' || 'review'):
                $result[$item->province][$item->industry]['sold']++;
                break;
        }
    }

如果该特定省份,行业组合尚不存在,请创建一个已售出且免费设置为0的数组项目。

然后根据项目状态+1到必要的密钥。

非常自我解释。