PHP中使用foreach遍历数组的FDF写入函数为何无法运行?
解决PHP生成FDF文件时仅首个调试语句输出的问题
嗨,我来帮你看看这个问题!你作为PHP新手遇到的这种情况——只有第一个hey there能输出,后面的调试语句都没动静——大概率是脚本执行到某一步出错直接终止了,咱们一步步拆解问题:
核心问题排查
1. 变量名大小写错误(最直接的终止原因)
你函数参数里定义的是$fileHandle(H是大写),但在fwrite里写的是$filehandle(h是小写)!PHP是严格区分变量名大小写的,这就导致fwrite调用时找不到正确的文件句柄变量,直接触发错误。如果你的PHP环境没开启错误显示,脚本就会静默终止,后面的echo自然不会执行。
2. 数组遍历逻辑冗余+字段名拼接错误
看你的$reportNameToFieldNumsArray结构,每个$reportName对应的是一维数组(比如"report1" => array("1")),但你用了两层foreach:
- 第一层
foreach($valuesArray as $fieldNums)拿到的其实是单个字符串(比如"1") - 第二层
foreach($fieldNums as $fieldNum)遍历字符串会按字符拆分,虽然对单字符的情况能跑,但逻辑完全没必要,而且如果遇到空数组(比如"report7"),外层循环直接跳过,也不会输出调试语句。
另外,你在fwrite里拼接字段名时用了$reportNameToFieldNumsArray[$reportName],这是个数组,直接拼到字符串里会输出Array,完全不符合FDF的字段名要求,应该用遍历到的$fieldNum。
3. FDF语法错误
你写的/V /(' . $value . ')多了个斜杠,正确的FDF字段值格式应该是/V (' . $value . ')。
修复后的完整函数
function writeFDFTextboxLines($reportNameToFieldNumsArray, $reportName, $fileHandle, $value) { echo "hey there <br />"; // 先判断当前reportName是否存在数组中,避免Undefined index错误 if (!isset($reportNameToFieldNumsArray[$reportName])) { echo "当前报告名不存在于数组中 <br />"; return; } $valuesArray = $reportNameToFieldNumsArray[$reportName]; // 直接遍历一维数组即可 foreach($valuesArray as $fieldNum) { echo "hey there <br />"; if(strlen(trim($fieldNum)) > 0) { // 加trim处理可能的空字符 echo "hey there <br />"; // 修正字段名拼接和FDF语法 $fieldName = $reportName . "Textbox" . $fieldNum; $fdfLine = '<< /T (' . $fieldName . ') /V (' . $value . ')>>' . "\n"; // 修正变量名大小写 fwrite($fileHandle, $fdfLine); } } }
新手调试小贴士
作为PHP新手,建议先开启错误显示,方便快速定位问题:
在PHP脚本开头加上这两行:
error_reporting(E_ALL); ini_set('display_errors', 1);
这样脚本出错时会直接在页面显示错误信息,不用再猜哪里出问题啦!
内容的提问来源于stack exchange,提问作者clearcom0
相关产品推荐
相关产品推荐

