laravel 数组 groupBy 特定列值

laravel array groupBy specific column value

我在 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"},
     ]
    }

希望能帮到你(应该都转成数组)

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;
}

您可以使用 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:您可能需要根据您的要求稍微更改它。

感谢所有试图帮助我的人。我想到了如何解决它。 我将尝试在这里进行解释。 首先,我得到了我存储的所有天数。然后:

$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" 的新日期。 希望我说得够清楚!

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

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(),
              ];
            });