如何通过包含数千个数字的文件搜索确切的数字


How can I search for exact number through a file containing thousands of numbers?

如果我们说我们有一个包含订单号或引用的文本文件(每 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"。