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