PHP提取字符串单词首字母出现Uninitialized string offset报错如何解决
报错原因
Uninitialized string offset: 0 报错的核心诱因是代码在替换停用词后产生了无效空字符串元素:
- 把停用词
the替换为空后,原字符串开头会残留空格,也可能因为多个停用词相邻产生连续空格 - 直接用
explode(" ", $entityWords)按空格拆分时,会把连续/首尾空格拆成多个空字符串元素 - 空字符串没有下标为
0的字符,访问时就会触发Notice提示,因为空元素不会贡献首字母,所以最终输出结果还是正确的。
解决方案
不需要提前预知单词数量,只需要对拆分后的结果做过滤,或者访问字符前加简单判断即可,以下是修正后的可用代码:
$article = 'the Central intelligence agency'; $words = array('the', 'of', 'to' ); $pattern = '/\b(?:' . join('|', $words) . ')\b/i'; $entityWords = preg_replace($pattern, '', $article); // 清理多余空格,避免拆分出空元素 $entityWords = trim(preg_replace('/\s+/', ' ', $entityWords)); $words = explode(" ", $entityWords); $entityAcro = ""; foreach ($words as $word) { // 遍历到当前元素时自动判断非空再取首字符,无需提前预知单词数量 if (!empty($word)) { $entityAcro .= $word[0]; } // 若需要兼容中文等多字节字符首字提取,可替换为下面的写法,也不会产生报错 // $entityAcro .= mb_substr($word, 0, 1); } echo strtoupper( $entityAcro );
优化说明
- 先清理多余空格再拆分,从根源上减少空元素产生
- 遍历加非空判断是对每个遍历到的元素单独做校验,完全适配所有不确定长度的组织机构名场景
- 使用
mb_substr写法可兼容多字节字符场景,适用范围更广。
内容的提问来源于stack exchange,提问作者imagIne
相关产品推荐
相关产品推荐

