PHP使用双分隔符拆分文本生成索引数组时取值异常问题咨询
问题核心原因
- 拆分结果未回写原数组:执行完
$tablerow = explode("#", $alldata)后,$tablerow为一维数组,每个元素是对应分组的原始字符串(例如$tablerow[0] = "audi,bmw,mercedes")。你在嵌套循环中用explode(",", $tablerow[$tablerowindex])得到的拆分结果仅存在于临时变量$tablecolumn中,既没有将拆分后的二维结构写回$tablerow的对应位置,还会在每次内层循环迭代时被覆盖,全程没有修改$tablerow本身的结构。 - PHP字符串的索引取值规则:因为
$tablerow始终是存储字符串的一维数组,执行echo $tablerow[0][1]时,PHP会将$tablerow[0]对应的字符串按字节偏移取值,索引1的位置正好是字符串"audi,bmw,mercedes"的第二个字符'u',和你期望的取数组元素的行为完全不符。 - 循环边界设置偏差:内层循环设置的取值范围是
0 <= $tablerowindex <= 3,但单个分组仅包含3个汽车品牌,有效索引为0、1、2,走到索引3时会触发未定义偏移的警告,且因为没有回写拆分结果,这段循环执行后没有任何实际作用。
修正后可正常运行的代码
$datafile = fopen("data.txt","r"); $alldata = fread($datafile, filesize("data.txt")); // 按#拆分得到所有大分组的一维字符串数组 $tablerow = explode("#", $alldata); // 遍历每个大分组,将拆分后的品牌数组替换原字符串元素 foreach ($tablerow as $groupKey => $groupStr) { // trim()用于去除内容首尾可能存在的换行、多余空格 $tablerow[$groupKey] = explode(",", trim($groupStr)); } // 此时取第一个分组的第二个元素,会正确输出bmw echo $tablerow[0][1];
内容的提问来源于stack exchange,提问作者Joe Remsen
相关产品推荐
相关产品推荐

