Где функция PHP file () получает номера строк? - PullRequest
1 голос
/ 26 ноября 2011

Когда я выполняю следующий код, я получаю список строк из файла с номерами строк.

<?php
$lines = file('C:\sm\lines.txt');
foreach ($lines as $line_num => $line) {
    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}
?>

Теперь я представляю, что массив, возвращаемый file(), будет простымразмерный вектор, и я должен был бы держать переменную line_num в моем цикле.Как здесь работает, что я получаю ассоциативную пару $line_num => $line для каждой строки в файле?

Ответы [ 4 ]

6 голосов
/ 26 ноября 2011

file - это то же самое, что итерация указателя файла и добавление каждой строки в файле в массив.Вы не получаете номера строк, но обычный числовой индекс в массиве.

Другими словами, file делает

function file($filename) 
{
    $fp = fopen($filename);
    while (!eof($fp)) {
        $lines[] = fgets($fp);
    }
    fclose($fp);
    return $lines;
}

Это, конечно, упрощено.Если вы хотите узнать точные детали, взгляните на

Что касается того, почему вы можете сделать

foreach ($lines as $line_num => $line) {

см.http://php.net/manual/en/control-structures.foreach.php

foreach (array_expression as $value) statement
foreach (array_expression as $key => $value) statement

Первая форма зацикливается на массиве, заданном array_expression.На каждой итерации значение текущего элемента присваивается $ value, а внутренний указатель массива увеличивается на единицу (поэтому на следующей итерации вы будете смотреть на следующий элемент).

ВторойФорма будет дополнительно присваивать ключ текущего элемента переменной $ key на каждой итерации.

1 голос
/ 26 ноября 2011

Неассоциативный массив автоматически получает назначенные ключи числового массива, т.е.

array(
  0 => 'first item',
  1 => 'second item,
  ...
  9 => 'tenth item',
);

Таким образом, ключ массива оказывается номером строки минус один.

1 голос
/ 26 ноября 2011

Это не номер строки, это индекс записи в массиве.В этом случае его всегда $lineNumber = $index + 1, потому что file() создает новую запись индекса для каждой строки

0 голосов
/ 26 ноября 2011

Теперь я представляю, что массив, возвращаемый функцией file (), будет простым размерный вектор, и я должен был бы сохранить переменную line_num в моем петля

Массив PHP на самом деле является упорядоченной картой:

http://uk.php.net/manual/en/language.types.array.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...