如何在使用fopen和fgetcsv函数的上下文中将while循环转换为foreach循环?

This is the standard code on php.net:

<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>
";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />
";
        }
    }
    fclose($handle);
}
?>

Let's assume that test.csv has 3 rows with:

cell11,cell12,cell13
cell21,cell22,cell23
cell31,cell32,cell33

Is it possible to use a foreach loop instead of the while used here and still get the values inside test.csv, for further use?

The code above gives this result:

3 fields in line 1: 
cell11
cell12
cell13
3 fields in line 2: 
cell21
cell22
cell23
3 fields in line 3: 
cell31
cell32
cell33

This is what I have tried:

<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
//    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
//        $num = count($data);
//        echo "<p> $num fields in line $row: <br /></p>
";
//        $row++;
//        for ($c=0; $c < $num; $c++) {
//            echo $data[$c] . "<br />
";
//        }
//    }
    foreach(($data = fgetcsv($handle, 1000, ",")) as $field){
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>
";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />
";
        }
    }
    fclose($handle);
}
?>

And the result:

3 fields in line 1: 
cell11
cell12
cell13
3 fields in line 2: 
cell11
cell12
cell13
3 fields in line 3: 
cell11
cell12
cell13

This:

foreach(($data = fgetcsv($handle, 1000, ",")) as $field){ ...

Passes the data from fgetcsv to the new variable $data which doesn't make sense in this case. You can just write this:

foreach (fgetcsv($handle, 1000, ",") as $field) { …

But to explain why foreach doesn't work:

As fget (and thus fgetcsv) is a function it does not work as an array, it just returns one, namely the next line in the file.

The foreach example above just gets the first line from that function and iterates over it. This means you iterate over each column of the first line.