Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Помогите с чтением файла


Автор: SEVKA 10.10.2008, 00:29
Столкнулся вот с какой проблемой ... при чтениии и распечатке содержимого текстового файла 

код 

Код

$log_file = "log.txt";
$log_list = file($log_file);
$log_count = count($log_list); 
$log_fp = fopen($log_file, "r");
for($i=0; $i<$log_count ; $i++)
{
$log_str = $log_list[$i];
$log_str_t = trim($log_str);
$n_log_array = explode("\t", $log_str_t);
if($n_log_array[6] == 0)
{ 
echo "{$log_list[$i]} and $i <br>";
}
}
fclose($log_fp);

работает совершенно корректно 


а если пробую читать строки снизу вверх 
Код

$log_file = "log.txt";
$log_list = file($log_file);
$log_count = count($log_list); 
$log_fp = fopen($log_file, "r");
for($i=$log_count-1; $i>=0 ; $i--)
{
$log_str = $log_list[$i];
$log_str_t = trim($log_str);
$n_log_array = explode("\t", $log_str_t);
if($n_log_array[6] == 0)
{ 
echo "{$log_list[$i]} and $i <br>";
}
}
fclose($log_fp);


работает некорректно 

помогите разобраться в чем проблема 

заранее благодарен 

Автор: teroni 10.10.2008, 00:50
Да что-то Вы сами себе жизнь усложняете.. Столько переменных, лишнее функции fopen, fclose..
Если первое переписать покороче выйдет:
Код

foreach (file('log.txt') as $i => $line)
   {
   $p = explode("\t", trim($line));
   if ($p[6] == 0)
      echo "$line and $i <br>";
   }

А что Вы хотите от второго куска кода и чем он не корректен - я не понял.

Автор: SEVKA 10.10.2008, 01:23
Ну  это  на самом  деле  моя  первая  попытка  программированья  на  пхп  от того   такой  корявый  код  .  но  дело  не  в  отсутствии  стиля  .  
второй  кусок  кода  просто  не  фильтрует  по  заданному  критерию
 
Код
 if($n_log_array[6] == 0) 
  

и  я  сам  не  могу  понять  почему  

Автор: teroni 10.10.2008, 12:24
Странно, если первый работает, то должен и второй работать...
Если мой первый модифицировать - то будет что-то такое.
Код

foreach (array_reverse(file('log.txt')) as $i => $line)
   {
   $p = explode("\t", trim($line));
   if ($p[6] == 0)
      echo "$line and $i <br>";
   }

Автор: unicross 10.10.2008, 14:31
SEVKA, ваши коды на моем компе работают. И тот и другой при таком содержании файла "log.txt"

Код

а1    а2    а3    а4    а5    а6    0
б1    б2    б3    б4    б5    б6    0
в1    в2    в3    в4    в5    в6    1
г1    г2    г3    г4    г5    г6    0
д1    д2    д3    д4    д5    д6    0



Я немного модифицировал ваш код (убрал явно лишние элементы)

Код

$log_list = file("log.txt");
$log_count = count($log_list);
for ($i=0; $i<$log_count ; $i++)
//for ($i=$log_count-1; $i>=0; $i--)
{
   $log_str_t = trim($log_list[$i]);
   $n_log_array = explode("\t", $log_str_t);
   if ($n_log_array[6]  === "0") echo "{$log_list[$i]} and $i <br>";
   //if ($n_log_array[5] == 0) echo "{$log_list[$i]} and $i <br>";
}


При строке 

Код

for ($i=0; $i<$log_count ; $i++)


выводит 

Код

а1 а2 а3 а4 а5 а6 0 and 0 
б1 б2 б3 б4 б5 б6 0 and 1 
г1 г2 г3 г4 г5 г6 0 and 3 
д1 д2 д3 д4 д5 д6 0 and 4


а при 

Код

for ($i=$log_count-1; $i>=0; $i--)


выводит

Код

д1 д2 д3 д4 д5 д6 0 and 4 
г1 г2 г3 г4 г5 г6 0 and 3 
б1 б2 б3 б4 б5 б6 0 and 1 
а1 а2 а3 а4 а5 а6 0 and 0


Единственная проблема находится в строке 

Код

if ($n_log_array[6] == 0)


Все дело в том, что при использовании оператора == интерпретатор пытается преобразовать данные к одному типу. Если строку невозможно преобразовать в число, то она приравнивается к 0. Попробуйте использовать строку

Код

if ($n_log_array[5] == 0) echo "{$log_list[$i]} and $i <br>";


и получите все элементы файла. Поэтому это выражение будет истинным если значение 0 или встретится просто строка. В этом случае лучше использовать оператор ===. Приведение типов здесь не производится.

Код

if ($n_log_array[6]  === "0") echo "{$log_list[$i]} and $i <br>";

Автор: MoLeX 10.10.2008, 14:35
Цитата(unicross @  10.10.2008,  14:31 Найти цитируемый пост)
Все дело в том, что при использовании оператора == интерпретатор пытается преобразовать данные к одному типу. Если строку невозможно преобразовать в число, то она приравнивается к 0. Попробуйте использовать строку

smile

Добавлено через 15 секунд
а случайно не сравнивает?

Добавлено через 1 минуту и 20 секунд
Цитата(unicross @  10.10.2008,  14:31 Найти цитируемый пост)
оператор ===.

а этот оператор вроде не только проверяет подходят ли данные но и смотрит что это (int, string, bool ...)

Автор: SEVKA 10.10.2008, 14:56
Большое  спасибо  всем  .  Дело  было  действительно  не  в  циклах  ,  а  в  записи  в  файл  log  .  Уже  исправляю   ошибки  .

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)