如何将索引数组转为以日期为键的关联数组并循环遍历子数组
解决方案:将索引数组转换为以日期为键的关联数组
没问题,我来帮你搞定这个数组转换的需求,同时给你讲清楚遍历的方法~
首先先把你提供的原数组用PHP代码清晰表示出来:
$originalArray = [ ['start_date' => '2018-03-27', 'start_time' => '10:00:00'], ['start_date' => '2018-03-28', 'start_time' => '11:00:00'], ['start_date' => '2018-03-28', 'start_time' => '12:00:00'], ];
方法一:用foreach循环实现转换(最直观易懂)
这也是你提到的通过循环遍历数组的方式,核心思路是遍历原数组的每个子元素,将相同start_date的元素归到同一个键下:
// 初始化目标空数组 $targetArray = []; foreach ($originalArray as $item) { // 取出当前子元素的日期作为键 $dateKey = $item['start_date']; // 如果目标数组中还没有这个日期键,先初始化一个空数组 if (!isset($targetArray[$dateKey])) { $targetArray[$dateKey] = []; } // 将当前子元素追加到对应日期的数组中 $targetArray[$dateKey][] = $item; }
转换完成后,$targetArray的结构就和你期望的一致了:
Array ( [2018-03-27] => Array ( [0] => Array ( [start_date] => 2018-03-27 [start_time] => 10:00:00 ) ) [2018-03-28] => Array ( [0] => Array ( [start_date] => 2018-03-28 [start_time] => 11:00:00 ) [1] => Array ( [start_date] => 2018-03-28 [start_time] => 12:00:00 ) ) )
如果你的需求是只保留start_time而不是整个子数组,只需要把代码里的$targetArray[$dateKey][] = $item;改成$targetArray[$dateKey][] = $item['start_time'];即可。
方法二:用array_reduce实现更简洁的转换
如果你喜欢更简洁的写法,可以用PHP的array_reduce函数来实现,效果和foreach完全一样:
$targetArray = array_reduce($originalArray, function($carry, $item) { $dateKey = $item['start_date']; $carry[$dateKey][] = $item; return $carry; }, []);
遍历转换后的数组获取子数组
转换完成后,如果你想遍历目标数组拿到每个日期下的子数组,可以用嵌套foreach:
foreach ($targetArray as $date => $subArrays) { echo "日期:{$date}\n"; foreach ($subArrays as $index => $subItem) { echo " 第{$index+1}个子项:开始时间 {$subItem['start_time']}\n"; } }
这段代码的输出会是:
日期:2018-03-27 第1个子项:开始时间 10:00:00 日期:2018-03-28 第1个子项:开始时间 11:00:00 第2个子项:开始时间 12:00:00
内容的提问来源于stack exchange,提问作者Yushko Aleksandr
相关产品推荐
相关产品推荐

