PHP从CSV中获取无循环的随机行

PHP从CSV中获取无循环的随机行,php,csv,random,Php,Csv,Random,我有多个超过一百万行的大CSV文件。我不能改变 我需要在一个循环中,得到一个随机CSV文件的随机行,并输出这一行 目前我有: for ($i=0; $i < 50; $i++) { $randomFile = $files[array_rand($files)]; if (($handle = fopen($randomFile, "r")) !== FALSE) { //HERE I NEE

我有多个超过一百万行的大CSV文件。我不能改变

我需要在一个循环中,得到一个随机CSV文件的随机行,并输出这一行

目前我有:

        for ($i=0; $i < 50; $i++) {
            $randomFile = $files[array_rand($files)];

            if (($handle = fopen($randomFile, "r")) !== FALSE) {
                //HERE I NEED TO GET A RANDOM LINE OF $handle FILE
            }
        }
我怎样才能得到我的CSV$句柄的随机行,而不是像我在任何地方看到的所有解决方案一样的循环

我已经尝试了循环解决方案,但我的CSv文件太大,每次脚本都会冻结


谢谢

这能解决问题吗

<?php
for ($i=0; $i < 50; $i++) {
    $randomFile = $files[array_rand($files)];

    if (($handle = fopen($randomFile, "r")) !== FALSE) {
        $randomLineIndex = array_rand($data = fgetcsv($handle, filesize($randomFile), ","));
        print_r($data[$randomLineIndex]);
        exit;
    }
}
最新答复:

根据@Robbie在下面评论部分的回答,性能会更好

<?php
for ($i=0; $i < 50; $i++) {
    $randomFile = $files[array_rand($files)];
    $randomLineIndex = array_rand(file($randomFile));    
    print_r($data[$randomLineIndex]);
}

这是不可能的。您可以将文件读取到数组中,并从数组中获取一个随机单元。这需要更多的计算机资源,不适合大文件,或者您可以生成随机数,并在读取所需行后使用循环和中断转到此行。

您不能,唯一的方法是循环;你甚至不能在没有循环的情况下计算行数。。。。对于大文件,这需要时间。。。。。但你为什么要用csv文件来做这件事呢?为什么不使用数据库呢?我完全同意上面的@MarkBaker^^^,读取这样大小的文件将是一项代价高昂的工作。即使使用file\u get\u contents/explode/count/rand来获取随机元素/行。@MarkBaker数组\u randfile$randomFile呢?PHP方法本身可能有一个循环,但不是显式的。。。编辑:当然我知道这会将整个文件加载到内存中,但这不是问题所在:@Robbie-你尝试将一个包含一百万条记录的文件加载到PHP数组中。。。。即使您设置了无限内存,您也会达到内存限制,并且仍然需要forever@MarkBaker如果对它有特殊要求,可以调整服务器规格以适应。当然,这些都是纯理论的,因为任务需求更可能需要考虑!array_randfile$randomFile可能是最简单的Robbie,它是一个线性的,性能可能更好,无需通过“,”解析。