使用explode()拆分字符串时出现数组键1未找到异常的问题求助
问题分析与解决方案
核心原因
你调试时看到的是正常元素的输出,但**$hours数组中存在部分元素的time字段不包含-分隔符**(比如空字符串、格式错误的时间值)。当explode('-', $xxx, 2)处理这类字符串时,只会返回1个元素的数组,解构赋值[$first, $last]就会因找不到索引1抛出异常。
解决方案
1. 兜底解构赋值(快速修复)
给解构结果加上默认值,避免数组索引不存在的问题:
[$first, $last] = explode('-', $hours[$key]['time'], 2) + [null, null]; // 后续可根据需求处理null情况,比如设置默认值 $beginTime = $first ? trim($first) : ''; $endTime = $last ? trim($last) : '';
2. 前置检查(更严谨)
先判断字符串是否包含分隔符,再处理异常场景:
$time = $hours[$key]['time']; $beginTime = ''; $endTime = ''; if (str_contains($time, '-')) { [$first, $last] = explode('-', $time, 2); $beginTime = trim($first); $endTime = trim($last); } else { // 可选:跳过异常元素,或者设置默认值 // continue; } $days[] = [ 'id' => $hours[$key]['id'], 'day' => $key, 'begin_time' => $beginTime, 'end_time' => $endTime, 'free' => false, ];
3. 优化拆分规则(适配带空格的分隔符)
你的示例中分隔符是-(带空格),用explode('-')会导致拆分后元素带空格,虽然trim能处理,但可以用正则拆分更精准:
[$first, $last] = preg_split('/\s*-\s*/', $hours[$key]['time'], 2) + [null, null];
排查建议
先遍历输出所有$hours[$key]['time']的值,确认是否存在格式异常的条目,这是从根源解决问题的关键。
内容的提问来源于stack exchange,提问作者peterhillie
相关产品推荐
相关产品推荐

