【问题标题】:laravel array groupBy specific column valuelaravel 数组 groupBy 特定列值
【发布时间】:2021-06-15 18:13:17
【问题描述】:

我正在使用 laravel 中的数组,结果如下:

   $datesArr = [ {
        "day": "monday",
        "date": "2021-05-03"
    },
    {
        "day": "monday",
        "date": "2021-05-10"
    },
    {
        "day": "monday",
        "date": "2021-05-17"
    }
]

我想要的是这个:

   {
    "day": "monday",
    "dates" : [
       {"date": "2021-05-03"},
       {"date": "2021-05-10"},
       {"date": "2021-05-17"},
     ]
    }

【问题讨论】:

  • 到目前为止您尝试过什么?顺便说一句,这是 JSON,而不是 php 数组

标签: arrays laravel laravel-collection


【解决方案1】:

希望对你有帮助(应该全部转为数组)

public static function  buildArrayGroupBy($key, $data , $lockKey = null) {
    $result = array();
    foreach($data as $val) {
        if(array_key_exists($key, $val)){
            if(!is_null($lockKey)){
                $result[$val[$key]][] = $val[$lockKey];
            }else{
                $result[$val[$key]][] = $val;
            }

        }else{
            $result[""][] = $val;
        }
    }
    return $result;
}

【讨论】:

    【解决方案2】:

    你可以使用 Laravel Collection 的 groupBy 函数。

    输出将采用以下格式,但它会完成这项工作。

    $datesArr = [
        "monday" => [
            {
                "day": "monday",
                "date": "2021-05-03"
            },
            {
                "day": "monday",
                "date": "2021-05-10"
            },
            {
                "day": "monday",
                "date": "2021-05-17"
            }
        ]
    ]
    

    如需准确输出,您可以使用mapToGroups

    $data->mapToGroups(function($i) {
        return ['day' => $i['day'],
                'dates' => [
                     'date' => $i['date']
               ]];
    });
    

    P.S:您可能需要根据您的要求进行一些更改。

    【讨论】:

    • 谢谢你,杰瑞,我正在使用这个 groupBy 函数,但我需要那个特定的回报之王。
    【解决方案3】:

    感谢所有试图帮助我的人。我想到了如何解决它。 我会在这里尝试解释一下。 首先,我得到了我存储的所有天数。那么:

    $daysArr = array();
                    foreach($days as $key => $day){
                        $datesArr = array();
                        for($i = 0;$i< 8;$i++){
                            $newDate['date'] = now()->next($key)->addWeeks($i)->toDateString();
                            array_push($datesArr,$newDate);
                        }
                        $test['day'] = $key;
                        $test['dates'] = $datesArr;
                        array_push($daysArr,$test);
                        unset($datesArr);
                    }
            return $daysArr;
    

    我做了 double array_push 和 foreach "new day" ,我取消设置 $datesArr 以获得空数组来推送 "new day" 的新日期。 希望我说得够清楚!

    【讨论】:

      【解决方案4】:

      让我们根据您的要求生成一些虚拟数据:

      foreach(range(1,100) as $rangeTbs){
        $carbon = \Carbon\Carbon::now()
          ->addDays(rand(1,20))
          ->addMonths(rand(1,2));
      
        $dateArrayTbs[] = [
                  'day' => $carbon->format('l'),
                  'date' => $carbon->format('Y-m-d'),
              ];
      }
      

      现在我们可以将数组转换为集合了:

      $collection = collect($dateArrayTbs)
               //Grouping By day 
                  ->groupBy('day')
              //Now Converting into Desired Format
                  ->map(function(Collection $collection,$day){
                    return [
                      'day' => $day,
                      'dates' => $collection->sortBy('date')->toArray(),
                    ];
                  });
      

      【讨论】:

      • 请不要为 Stack Overflow 上迟到的答案道歉。这个网站是专门为让人们在他们喜欢的任何时候回答而建立的。什么是好的答案可能会随着时间而改变,而旧的答案可能会变得不那么相关。因此,如果您有问题的答案,只需发布​​它,减去关于其年龄的任何评论。
      猜你喜欢
      • 2022-06-16
      • 2018-09-18
      • 2018-03-21
      • 2016-07-15
      • 1970-01-01
      • 2022-01-02
      • 2022-01-11
      • 2021-03-16
      • 1970-01-01
      相关资源
      最近更新 更多