如何将含STOPSALES的扁平日期数组分组为子数组?
按STOPSALES分组日期数组的实现方法
我有一个包含日期字符串和"STOPSALES"字符串的扁平数组,想要生成一个仅包含日期值的新数组,每遇到"STOPSALES"时就创建新的子数组分组。
原数组
[0]=> string(10) "2023-03-10" [1]=> string(10) "2023-03-11" [2]=> string(10) "2023-03-12" [3]=> string(10) "2023-03-13" [4]=> string(10) "2023-03-14" [5]=> string(10) "2023-03-15" [6]=> string(9) "STOPSALES" [7]=> string(9) "STOPSALES" [8]=> string(9) "STOPSALES" [9]=> string(9) "STOPSALES" [10]=> string(9) "STOPSALES" [11]=> string(9) "STOPSALES" [12]=> string(9) "STOPSALES" [13]=> string(9) "STOPSALES" [14]=> string(9) "STOPSALES" [15]=> string(9) "STOPSALES" [16]=> string(9) "STOPSALES" [17]=> string(10) "2023-03-27" [18]=> string(10) "2023-03-28" [19]=> string(10) "2023-03-29" [20]=> string(10) "2023-03-30" [21]=> string(10) "2023-03-31" [22]=> string(10) "2023-04-01" [23]=> string(10) "2023-04-02" [24]=> string(10) "2023-04-03"
期望结果
[0]=> array(6) { [0]=> string(10) "2023-03-10" [1]=> string(10) "2023-03-11" [2]=> string(10) "2023-03-12" [3]=> string(10) "2023-03-13" [4]=> string(10) "2023-03-14" [5]=> string(10) "2023-03-15" } [1]=> array(8) { [0]=> string(10) "2023-03-27" [1]=> string(10) "2023-03-28" [2]=> string(10) "2023-03-29" [3]=> string(10) "2023-03-30" [4]=> string(10) "2023-03-31" [5]=> string(10) "2023-04-01" [6]=> string(10) "2023-04-02" [7]=> string(10) "2023-04-03" }
我尝试的代码
$res = []; $num = 0; foreach ($array as $go) { if ($go == 'STOPSALES') { continue; } else { $num = $num+1; array_push($res[$num],$go); } } var_export($result);
正确实现方法
你的代码存在两个核心问题:
- 未初始化
$res[$num]就调用array_push,会触发PHP警告 - 每次遇到日期就递增
$num,导致分组索引混乱,且连续的STOPSALES无法触发新分组创建
以下是正确的实现代码:
$res = []; $currentGroup = []; foreach ($array as $item) { if ($item === 'STOPSALES') { // 仅当当前分组有内容时才加入结果,避免连续STOPSALES产生空数组 if (!empty($currentGroup)) { $res[] = $currentGroup; $currentGroup = []; } } else { // 将日期追加到当前分组 $currentGroup[] = $item; } } // 循环结束后,处理最后一组未被加入的日期(避免因无后续STOPSALES而遗漏) if (!empty($currentGroup)) { $res[] = $currentGroup; } var_export($res);
逻辑说明
- 用
$currentGroup临时存储当前分组的日期 - 遍历数组时,遇到
STOPSALES就检查当前分组是否有内容,有则加入结果并重置分组 - 遇到日期直接添加到当前分组
- 循环结束后必须检查一次
$currentGroup,确保最后一组日期被正常加入结果
内容的提问来源于stack exchange,提问作者Derek Robins
相关产品推荐
相关产品推荐

