Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: foreach для строки из файла
 
 автор: izzi   (24.08.2006 в 10:31)   письмо автору
 
 

Такая задача:

Считать содержимое файла построчно и загнать в массив,
затем разбирая этот массив по одному элементу (каждый элемент содержит строку) обрабатывать его функцией explode.

файл выглядит следующим образом:

string | other string
strin2| other string2

Читаю файл:


function fgetsData() {
      if (!$this->err) {
            while (!feof($this->handle)) {
       $buffer = fgets($this->handle);
    $buffer = trim($buffer);
    if ($buffer!=="");
    $content[] = $buffer;
            }
      return $content;    
      }
return false;
}    


Делаю explode строки:

function strExplode($separator, $string, $int=false) {
     if ($separator !== "") {
          if ($int == false) {
               return (explode($separator, $string)); 
          } else {
               return (explode($separator, $string, $int)); 
          }                        
     }
     return $string;
}


Так вот вопрос:

Под Windows системой всё работает на ура! На хостинге под unix PHP Version 4.3.10-10ubuntu3.7 tckb hfp, если разбирать массив возвращаемый fgetsData() конструкцией foreach, то первый элемент возвращается ка Array, а должна быть строка вида string | other string, в чём проблема?!

   
 
 автор: cheops   (24.08.2006 в 11:32)   письмо автору
 
   для: izzi   (24.08.2006 в 10:31)
 

Хм... а почему для решения перевой части задачи не испльзовали стандартную функцию file() - или она не подходит?

   
 
 автор: izzi   (24.08.2006 в 11:43)   письмо автору
 
   для: cheops   (24.08.2006 в 11:32)
 

Работаю сразу с несколькими файлами, поетому проще обращаться к ним по идентификатору файла fopen.

   
 
 автор: cheops   (24.08.2006 в 11:49)   письмо автору
 
   для: izzi   (24.08.2006 в 11:43)
 

А нет возможности проверить, что там за массив образуется? Попробуйте вывести его дамп
<?php
  
echo "<pre>";
  
print_r($имя_массива);
  echo 
"</pre>";
?>

   
 
 автор: izzi   (24.08.2006 в 11:59)   письмо автору
 
   для: cheops   (24.08.2006 в 11:49)
 


$file_content = $list->fgetsData();
echo "<pre>";
print_r($file_content);
echo "</pre>";


Получаем:
Array
(
[0] => www.txt | abandon
[1] => neXt.txt | version
)

Затем проходимся по массиву:

if ($file_content !== false) {
    foreach($file_content as $string) {
        echo "<br>".$string;
        $buffer = $list->strExplode($SYS_STRING_SEPARATOR, $string);        
        if ((file_exists($_SERVER['DOCUMENT_ROOT'] . $_SUBROOT . "/teksti". "/" . $buffer[0])) && ($buffer[0]!=="")) {
            echo $buffer;
            $data[] = $buffer;
        }
    }
} else {
    $data = false;
}


Получаем:
Array
Array


А если так:

if ($file_content !== false) {
    foreach($file_content as $string) {
        echo "<br>";
        echo "<pre>";
        print_r($string);
        echo "</pre>";
        $buffer = $list->strExplode($SYS_STRING_SEPARATOR, $string);        
        if ((file_exists($_SERVER['DOCUMENT_ROOT'] . $_SUBROOT . "/teksti". "/" . $buffer[0])) && ($buffer[0]!=="")) {
            echo $buffer;
            $data[] = $buffer;
        }
    }
} else {
    $data = false;
}
:


то:
Array
(
[0] => www.txt | abandon
[1] => 0
)



Array
(
[0] => neXt.txt | version
[1] => 1
)


так почему же образуется массив и откуда берутся значения
[1] => 0
[1] => 1

в файле их нету же ....?

   
 
 автор: izzi   (24.08.2006 в 13:26)   письмо автору
 
   для: cheops   (24.08.2006 в 11:49)
 

Может есть какие идеи?!
Помойму foreach в Unix системах иначе работает, могут ли на работу foreach повлиять настройки php.ini?!

   
 
 автор: cheops   (25.08.2006 в 12:01)   письмо автору
 
   для: izzi   (24.08.2006 в 13:26)
 

Нет не могут. foreach работает одинаково во всех операционных системах
> если разбирать массив возвращаемый fgetsData() конструкцией foreach, то первый элемент
> возвращается ка Array,
Всё правильно, у вас функция имеет вид
<?php
function fgetsData() { 
      if (!
$this->err) { 
            while (!
feof($this->handle)) { 
       
$buffer fgets($this->handle); 
    
$buffer trim($buffer); 
    if (
$buffer!==""); 
    
$content[] = $buffer
            } 
      return 
$content;     
      } 
return 
false
}
?>

Строка $content[] = $buffer; - и даёт массив.

   
 
 автор: izzi   (25.08.2006 в 17:43)   письмо автору
 
   для: cheops   (25.08.2006 в 12:01)
 

Спасибо за ответ, вы правы ! $content[] = $buffer даёт массив, но $buffer - это ведь строка (или же нет?), то первый элемент массива $content[0] - то же должен быть строкой..., второй и т.д.!
У меня же почему-то на хостинге первый элемент содержал массив, в котором(уже в подмассиве) первым элементом оказалась небходимая строка из файла, а вторым (как оказалось) скорей всего ключом массива $content[]....В общем вся логика стала на свои места когда в foreach стал указывать переменную для ключа массива


 foreach($file_content as $key=>$string) 



if ($file_content !== false) { 
    foreach($file_content as $key=>$string) { 
        echo "<br>".$string; 
        $buffer = $list->strExplode($SYS_STRING_SEPARATOR, $string);         
        if ((file_exists($_SERVER['DOCUMENT_ROOT'] . $_SUBROOT . "/teksti". "/" . $buffer[0])) && ($buffer[0]!=="")) { 
            echo $buffer; 
            $data[] = $buffer; 
        } 
    } 
} else { 
    $data = false; 




А ответ почему так и остался загадкой

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования