Проблема с ф-цией list()

lifer

Guest
Проблема с ф-цией list()

Есть такой кусок скрипта:
PHP:
$f=fopen($fname,'r+');
while (!feof ($f))
        {
        $data = fgets($f, 4096);
        if ($data != '');
            {
             list($user[], $town[], $status[]) = explode(",", $data);
            }
        }
Проблема в том, что раньше он работал, а со вчерашнего дня начал выдавать такую ошибку:
Fatal error: [] operator not supported for strings in /home/.... on line 39.

Помогите разобраться в чем проблема...
Заранее благодарен.
 

neko

tеam neko
проблемам в твоем файле
там видимо нету тех данных которые ты ожидаешь
 

Profic

just Profic (PHP5 BetaTeam)
проблема в скрипте
что-то из $user[], $town[], $status[] имеет тип строки (заданный выше) О чем кстати и сообщает ошибка.
 

lifer

Guest
вот файл, который я открываю:
123,123,123
123,123,123
123,123,123


Вот почти весь скрипт:

PHP:
<?
$fname='123.txt';


$f=fopen($fname,'r+');
while (!feof ($f))
        {
          $data = fgets($f, 4096);
        if ($data != '');
         {
        list($user[], $town[], $status[]) = explode(",", $data);
         }
       }


?>

<center>

<table width="85%" border=1>

<?

for($i=0;$i<count($user);$i++)

	{
   
	echo "<tr>

				<td><img src='img/warmakerssmall.gif'> $user[$i]</td>

				<td><center><a href='http://capitalcity.combats.ru/inf.pl?login=$user[$i]' target='_blank'><img src='../img/inf.gif'></center></a></td>

				<td>$town[$i]</td>

				<td>$status[$i]</td>

			</tr>";

	}

?>

</table>
        }
}

Это почти весь скрипт, я вырезал ненужный кусок. Тип переменных я нигде явно не объявлял. Не пойму в чем ошибка....
 

Crazy

Developer
Re: Проблема с ф-цией list()

Автор оригинала: lifer
list($user[], $town[], $status[]) = explode(",", $data);
Объясни, please -- просто на русском -- чего ты хотел добиться, добавляя [] к $user, $town и $status?
 

lifer

Guest
Я хотел чтобы данные из файла записывались в массивы $user, $town, $status. Т.е. если файл будет такой:
Юзер1,town1,status1
Юзер2,town2,status2
Юзер3,town3,status3

то соотв. создадутся массивы $user, $town, $status.
 

Crazy

Developer
Ну так вынужден тебя огорчить: не создадутся. list требует обычных скалярных переменных.
 

Demiurg

Guest
Crazy
помоему $arr[] - это вполне скалярное выражение.

lifer
Если ты используешь переменную, то перед использованием её надо инициализировать. Массивы инициадизируются так:
$arr = array();
 

lifer

Guest
Demiurg
Спасибо большое. Все заработало.

Только вот еще вопрос остался: Раньше этот скрипт работал и без явного определения типа переменных, да и в мануале я читал что интерпретатор сам определяет какой тип давать переменной... интересно почему вдруг ПХП начал работать с этими переменными как со строками а не с массивами?
 

savage[2]

Guest
Все они делятся и в массив (http://ru3.php.net/.....list.php ). Попробуй так:
PHP:
list($user[], $town[], $status[]) = split(",", $data);
Да и еще, это можно все в одном цикле сделать:
PHP:
<? 
$fname='123.txt'; 
$f=fopen($fname,'r+');
print '<table width="85%" border=1 align="center">';
while (!feof ($f)) 
{
	$data = fgets($f, 4096); 
	if ($data != '');
	{
		list($user, $town, $status) = split(",", $data); 
		print '<tr><td><img src=\'img/warmakerssmall.gif\'>'.$user.'</td>';
		print '<td><center><a href=\'http://capitalcity.combats.ru/inf.pl?login='.$user.' target=\'_blank\'><img src=\'../img/inf.gif\'></center></a></td>';
		print '<td>'.$town.'</td><td>'.$status.'</td></tr>';
	}
}
print '</table>';
fclose($f);
?>
Во наскока код короче стал. Хотя если в твои планы это не входит, не принемай это во внимание.
 

Demiurg

Guest
lifer
запомни правило:
перед применением переменной всегда инициализируй их. Наверняка это случилось не просто так, версию php обновил, или еще что.

-~{}~ 04.07.04 22:28:

savage[2]
ты в курсе чем split от explode отличается ?
 

savage[2]

Guest
split - практически тот же explode, только split в первом аргументе может работать с регулярными выражениями.
Подсказка: preg_split(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to split(). If you don't require the power of regular expressions, it is faster to use explode(), which doesn't incur the overhead of the regular expression engine.
(http://ru.php.net/...split.php)
 

lucas

Guest
savage[2]

1. Не "может работать", а "работает". А рег. выражения (тем более POSIX'овые) здесь не нужны вообще.

2. У человека был код, в котором данные были хоть как-то отделены от представления. Твой же "пример" этим не блещет.

Теперь вопрос: в чем был глубинный смысл твоего поста?
 

lifer

Guest
savage[2]
Твой вариант не подходит потому, что функцию считывания дынных из файла я использую не один раз и в разных скриптах...
 
Сверху