从TXT文件生成数组后,判断值是否存在的两种方法失效排查
问题
判断某个值是否存在于存储邮箱地址的TXT文件生成的数组中,使用foreach结合strpos或in_array两种方法均无法生效。已确认$text数组和$search变量的内容均正常,请问问题出在哪里?
对应代码:
$myfile = fopen("file.txt", "r") or die("Unable to open file!"); while(!feof($myfile)) { $text[] = fgets($myfile); } fclose($myfile); $search=$_POST['something']; foreach ($text as $val) { if (strpos($search, $val) !== FALSE) { echo "oK"; } }
或者:
if (in_array($search, $text)) { echo "OK"; }
问题根源
核心问题是fgets()读取每行内容时,会保留行尾的换行符(\n或\r\n),导致数组$text里的每个邮箱字符串末尾都带着换行符。而你从$_POST获取的$search是没有换行符的,所以:
in_array()会因为带换行符的数组元素和不带换行符的搜索值完全不匹配而失效;strpos($search, $val)不仅逻辑搞反了(应该用搜索值匹配数组元素,而非反过来),换行符的存在也会直接导致匹配失败。
解决方案
1. 读取文件时去除换行符
添加元素到数组前,用trim()去掉每行的换行符和多余空白,同时跳过空行避免无效元素:
$myfile = fopen("file.txt", "r") or die("Unable to open file!"); while(!feof($myfile)) { $line = trim(fgets($myfile)); if (!empty($line)) { $text[] = $line; } } fclose($myfile);
2. 修正strpos的匹配逻辑
将匹配逻辑调整为用搜索值去匹配数组元素,找到后可直接跳出循环提升效率:
foreach ($text as $val) { if (strpos($val, $search) !== FALSE || $val === $search) { echo "OK"; break; } }
3. 用in_array直接匹配
处理完换行符后,in_array()就能正常匹配:
if (in_array($search, $text)) { echo "OK"; }
内容的提问来源于stack exchange,提问作者argyx
相关产品推荐
相关产品推荐

