Laravel/PHP遍历数组按值类型格式化生成指定结构数组如何实现?
实现思路
- 遍历
$formData的键值对,逐行构造新子数组 - 按优先级判断
value_type:先判断是否为数字,再判断是否符合指定日期格式,都不满足则为text - 日期判断覆盖要求的3种格式,用Laravel自带的Carbon类做格式校验,避免手动写正则出错
代码实现
以下是Laravel环境下的简洁实现:
use Carbon\Carbon; $newFormData = collect($formData)->map(function ($value, $key) { // 第一步:判断是否为数字 if (is_numeric($value)) { $type = 'number'; } else { // 第二步:判断是否符合指定日期格式 $dateFormats = ['Y-m-d', 'Y/m/d', 'd/m/Y']; $isDate = false; foreach ($dateFormats as $format) { try { $date = Carbon::createFromFormat($format, $value); // 追加格式回验,避免2023-02-30这类非法日期被误判 if ($date && $date->format($format) === $value) { $isDate = true; break; } } catch (\Exception $e) { // 格式不匹配直接跳过 } } $type = $isDate ? 'date' : 'text'; } return [ 'field_name' => $key, 'value_type' => $type, 'value' => $value, ]; })->values()->toArray(); // 输出验证 dd($newFormData);
注意事项
- 判断顺序不要调整:如果先判断日期,类似
2024这类纯数字年份会被判定为数字,符合需求优先级 - 不想用Carbon的话,可以直接替换为PHP原生
DateTime类,逻辑完全一致 - 代码兼容你给出的示例输入,输出结果和要求的
$newFormData结构完全匹配
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

