PHP如何将while循环获取的结果存入全局变量并在其他函数中调用
问题原因
- 代码中仅调用了
OutputNames(),从未执行ReadNames(),读取姓名的逻辑全程没有运行 - PHP 函数内的变量默认是局部作用域,未显式声明为全局变量时,变量仅在当前函数内部生效,其他函数无法访问
- 当前while循环每次都会覆盖
$first和$last的值,最终只会保留文件最后一行的姓名,无法存储所有姓名数据
符合需求的修改方案(使用全局变量存储)
完全按照你要求的「全局变量存储、所有姓名分两个键存放、可跨函数访问」的逻辑实现:
<?php // 声明全局存储数组,分first、last两个键存储所有名和姓 $globalNames = [ 'first' => [], 'last' => [] ]; // 先执行读文件逻辑加载数据,再执行输出 ReadNames(); OutputNames(); function ReadNames() { // 声明使用全局变量 global $globalNames; $myFile = new SplFileObject("all/names.txt"); while (!$myFile->eof()) { $row = str_getcsv($myFile->fgets()); // 过滤空行避免下标报错 if (empty($row[0]) || empty($row[1])) continue; // 把当前行数据追加到全局数组对应分类下 $globalNames['first'][] = $row[0]; $globalNames['last'][] = $row[1]; } } function OutputNames() { global $globalNames; // 遍历输出所有姓名,可按需调整输出格式 foreach ($globalNames['first'] as $index => $firstName) { $lastName = $globalNames['last'][$index]; echo $firstName . " " . $lastName . "<br>"; } // 如果需要直接输出两个键的全量数据,可使用下方语句 // print_r($globalNames); } ?>
更规范的优化方案(避免全局变量污染)
全局变量容易引发意外的变量覆盖问题,更推荐用函数返回值传递数据,无需全局声明也能实现需求:
<?php function ReadNames() { $names = [ 'first' => [], 'last' => [] ]; $myFile = new SplFileObject("all/names.txt"); while (!$myFile->eof()) { $row = str_getcsv($myFile->fgets()); if (empty($row[0]) || empty($row[1])) continue; $names['first'][] = $row[0]; $names['last'][] = $row[1]; } return $names; } function OutputNames($names) { foreach ($names['first'] as $index => $firstName) { $lastName = $names['last'][$index]; echo $firstName . " " . $lastName . "<br>"; } } // 调用逻辑 $allNames = ReadNames(); OutputNames($allNames); ?>
内容的提问来源于stack exchange,提问作者Ahmed Mohammed
相关产品推荐
相关产品推荐

