如何在PHP中合并分组指定数组键并将内容按固定大小分块?
调整PHP数组分组与内容块拆分方案
我来帮你搞定这个数组结构重组的问题!根据你给出的需求,我们需要把原来的扁平数组按日期分组,同时将每组内的商品项拆分成每2个一组的content块。下面是具体的实现方案:
完整代码实现
// 你的输入数组(示例) $dataArray2 = array( 0 => 'your date is 22 may 2018, Tuesday.', 1 => 'hat: blue.', 2 => 'tshirt: white', 3 => 'hat: black.', 4 => 'tshirt: cyan', 5 => 'your date is 21 may 2018, Tuesday.', 6 => 'hat: red.', 7 => 'tshirt: blue', ); $result = []; $currentGroup = []; foreach ($dataArray2 as $item) { // 处理日期项,作为分组的起始 if(strpos($item, 'your date is') !== false) { // 如果当前已有未完成的分组,先整理后加入结果集 if (!empty($currentGroup)) { // 将收集的商品项拆分为每2个一组 $currentGroup['content'] = array_chunk($currentGroup['contentItems'], 2); unset($currentGroup['contentItems']); // 移除临时存储的字段 $result[] = $currentGroup; } // 初始化新分组,同时处理日期格式转换 $month_words = ["may"]; $month_numbers = ["05"]; $dateStr = str_replace($month_words, $month_numbers, $item); $dateStr = preg_replace('/[^0-9]/', '', $dateStr); $dateStr = substr_replace($dateStr, "-", 2, 0); $dateStr = substr_replace($dateStr, "-", 5, 0); $time = strtotime($dateStr); $formattedDate = date('Y-m-d', $time); $currentGroup = [ 'date' => $formattedDate, 'contentItems' => [] // 临时存储当前分组下的所有商品项 ]; } // 处理帽子项,提取纯值 else if (strpos($item, 'hat') !== false) { $value = trim(str_replace(['hat:', '.'], '', $item)); $currentGroup['contentItems'][] = $value; } // 处理T恤项,提取纯值 else { $value = trim(str_replace(['tshirt:', '.'], '', $item)); $currentGroup['contentItems'][] = $value; } } // 处理最后一个未加入结果集的分组 if (!empty($currentGroup)) { $currentGroup['content'] = array_chunk($currentGroup['contentItems'], 2); unset($currentGroup['contentItems']); $result[] = $currentGroup; } // 输出最终结果 echo '<pre>'; print_r($result); echo '</pre>';
代码逻辑说明
- 变量初始化:用
$result存储最终的分组结果,$currentGroup临时构建当前的日期分组(包含日期和临时收集的商品项)。 - 遍历处理每个元素:
- 遇到日期项时,先检查是否有未完成的分组,如果有就用
array_chunk()把临时收集的商品项拆成每2个一组,再将分组加入结果集,随后初始化新的日期分组。 - 遇到帽子或T恤项时,提取出纯文本值(去掉前缀和多余的点),存入当前分组的临时存储字段。
- 遇到日期项时,先检查是否有未完成的分组,如果有就用
- 收尾处理:遍历结束后,别忘了把最后一个未处理的分组也整理好加入结果集。
运行后的结果
Array ( [0] => Array ( [date] => 2018-05-22 [content] => Array ( [0] => Array ( [0] => blue [1] => white ) [1] => Array ( [0] => black [1] => cyan ) ) ) [1] => Array ( [date] => 2018-05-21 [content] => Array ( [0] => Array ( [0] => red [1] => blue ) ) ) )
内容的提问来源于stack exchange,提问作者Ricardo
相关产品推荐
相关产品推荐

