|
|
|
| Такая задача:
Считать содержимое файла построчно и загнать в массив,
затем разбирая этот массив по одному элементу (каждый элемент содержит строку) обрабатывать его функцией 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, в чём проблема?! | |
|
|
|
|
|
|
|
для: izzi
(24.08.2006 в 10:31)
| | Хм... а почему для решения перевой части задачи не испльзовали стандартную функцию file() - или она не подходит? | |
|
|
|
|
|
|
|
для: cheops
(24.08.2006 в 11:32)
| | Работаю сразу с несколькими файлами, поетому проще обращаться к ним по идентификатору файла fopen. | |
|
|
|
|
|
|
|
для: izzi
(24.08.2006 в 11:43)
| | А нет возможности проверить, что там за массив образуется? Попробуйте вывести его дамп
<?php
echo "<pre>";
print_r($имя_массива);
echo "</pre>";
?>
|
| |
|
|
|
|
|
|
|
для: 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
в файле их нету же ....? | |
|
|
|
|
|
|
|
для: cheops
(24.08.2006 в 11:49)
| | Может есть какие идеи?!
Помойму foreach в Unix системах иначе работает, могут ли на работу foreach повлиять настройки php.ini?! | |
|
|
|
|
|
|
|
для: 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; - и даёт массив. | |
|
|
|
|
|
|
|
для: 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;
}
|
А ответ почему так и остался загадкой | |
|
|
|