Я учу 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];
тогда я получаю правильный вывод. Так я не понимаю, почему мой чек не проходит?
Этот был хитрым; Я не виню тебя за то, что ты не поймал это 🙂
Итак, сначала давайте рассмотрим с 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!";
}
}
Других решений пока нет …