如果我们说我们有一个包含订单号或引用的文本文件(每 1 行仅 1 个数字),那么根据文件中的这些数字查找/验证输入(例如在表单中输入的数字)的最佳方法是什么?
有没有一个简单的想法来做到这一点?假设我们有数千个数字要搜索。
谢谢。
如果内存不是问题(演示):
if (in_array($number, file('numbers.txt', FILE_IGNORE_NEW_LINES))) {
// number exists - do something
}
由于file
返回一个数组,其中每一行都是数组中的一个元素,因此您还可以使用 array_search
查找找到它的行,或者array_keys
查找找到它的所有行。
如果内存有问题(演示):
foreach(new SplFileObject('numbers.txt') as $line) {
if ($number == $line) {
// number exists - do something
break;
}
}
当不确定使用哪个时,基准测试。
标记 CW,因为已经有几个问题询问如何逐行或有效地读取文件。
$file = file_get_contents("filename.txt");
if (strpos($file, "search string") === false) {
echo "String not found!";
}
如果数字是有序的: 不要将整个文件加载到内存中。 查找到文件的中间并读取数字。 如果你的数字比中间<,请寻找前半部分的中间。 否则寻求下半场的中间...
二叉搜索
如果要返回文件中匹配编号位置的行号,可以使用file()将引用文件作为文件行数组返回。
$search_string = '42';
$file_name = 'test_file.txt';
$file = file($file_name);
foreach($file as $line_number=>$number){
if(intval($search_string) == $number){
$found_on_lines[] = $line_number;
}
}
echo "String ".$search_string;
if(count($found_on_lines)>0){
echo " found on line(s):</br> ";
foreach($found_on_lines as $line){
echo $line."</br>";
}
}
else{
echo "not found in file ".$file_name.".";
}
这将输出
在行中找到的字符串 42:
9 256
如果您的参考文件在第 9 行和第 256 行包含数字"42"。