Неожиданное поведение при разборе текстового файла

Я учу PHP, & сейчас я застрял.
Я читаю файл .txt в сценарии. Содержимое файла выглядит так:

joe:secret
root:admin

Я могу легко прочитать файл, используя file() функция, которая возвращает массив. Я храню данные в переменной как:

$data = file('location/file.txt');

Затем я использую цикл foreach, а затем разбиваю каждую строку и снова сохраняю ее содержимое в переменной. Затем я проверяю переменную, но здесь я получаю поведение, которое не понимаю.

foreach ($data as $d) {
$row = explode(":", $d);

if ($row[0] == "joe" && $row[1] == "secret") {
echo "match found ";
}
}

Приведенный выше код дает ожидаемый результат. Это почему? Если я сделаю это,

echo $row[0]; echo $row[1];

тогда я получаю правильный вывод. Так я не понимаю, почему мой чек не проходит?

1

Решение

Этот был хитрым; Я не виню тебя за то, что ты не поймал это 🙂

Итак, сначала давайте рассмотрим с php -a интерактивная оболочка:

php > $data = file('test.txt');
php > var_dump($data);
array(3) {
[0]=>
string(11) "joe:secret
"[1]=>
string(11) "root:admin
"[2]=>
string(1) ""}

Видите, как заключительная цитата находится на отдельной строке? Это потому что \nв конце каждой строки хранятся внутри каждого элемента массива в $data, Так $row[1] не равный "secret"; это равно "secret\n", Чтобы это исправить, все что нам нужно это rtrim():

foreach ($data as $line) {
$line = rtrim($line);
$row = explode(":", $line);

if ($row[0] == "joe" && $row[1] == "secret") {
echo "Match found for joe!";
}
}

Теперь все работает как положено:

php > $data = file('test.txt');
php > foreach ($data as $line) {
php {   $line = rtrim($line);
php {   $row = explode(":", $line);
php {
php {   if ($row[0] == "joe" && $row[1] == "secret") {
php {     echo "Match found for joe!";
php {   }
php { }
Match found for joe!
php >

Редактировать: Мы могли бы также использовать file_get_contents() вместо file(), поэтому мы просто получаем содержимое файла в виде строки и сами конвертируем его в массив:

$data = file_get_contents('test.txt');
foreach (explode("\n", $data) as $line) {
$row = explode(":", $line);

if ($row[0] == "joe" && $row[1] == "secret") {
echo "Match found for joe!";
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]