PHP sizeof

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

Модератор: Модераторы

MaSe

PHP sizeof

Сообщение MaSe »

Код: Выделить всё

$url= 'http://forums.gorny.ru/index.php'; 
$source = file_get_contents($url);
if (!$source) die();
echo sizeof($source);
подскажите почему результат всегда 1? что неправильно?
Аватара пользователя
Count_Raven
Местный Бог
Сообщения: 2535
Зарегистрирован: 14 окт 2004, 18:48
Контактная информация:

Re: PHP sizeof

Сообщение Count_Raven »

Gromozeka писал(а):

Код: Выделить всё

$url= 'http://forums.gorny.ru/index.php'; 
$source = file_get_contents($url);
if (!$source) die();
echo sizeof($source);
подскажите почему результат всегда 1? что неправильно?
Неправильно используешь функции...

sizeof возвращает размер массива, а file_get_contents возвращает строку, а не массив, поэтому размер равен 1 - одна строка

можешь сначала поделить на строки таким путем

Код: Выделить всё

$url= 'http://forums.gorny.ru/index.php';
$source = file_get_contents($url);
if (!$source) die();
$lines_arr = split("\r\n", $source);
echo sizeof($lines_arr);
Так получишь количество строк и собственно массив с каждой строкой.
Аватара пользователя
Marug
UGUGUROV
UGUGUROV
Сообщения: 1142
Зарегистрирован: 21 окт 2003, 19:14
Откуда: Горно-Алтайск
Контактная информация:

Re: PHP sizeof

Сообщение Marug »

функция sizeof() это псевдоним для count()

int count (mixed var)
Возвращает количество элементов в var, которая обычно является array (поскольку все остальные состоят из одного элемента).
Если var это не массив, будет возвращено 1 (исключение: count(NULL) равно 0).
count() может возвращать 0 для переменной, которая не установлена, но может также возвращать 0 для переменной, которая была инициализирована пустым массивом.

PS: например Count(Raven) == 1 :P :-)

PPS: тебе скорее всего надо int strlen (string str) Возвращает длину строки string.
MaSe

Re: PHP sizeof

Сообщение MaSe »

не мне надо скачать html-ку определить построчно ее размер, найти нужное, и вырезать это от туда...
можно возпользоваться preg_match, но надо с регулярными выражениями разбираться...

2 Паша твой вариант тоже не канает...

ЗЫ хочу таблицу с погодой к себе на локальный сайт таскать... с загруженной страницей нормально работает, это когда $source = file('pogoda1.html'); а вот в варианте $source = file_get_contents($url); не хочет... конечно можно и с wget юзать, но хочется именно так...
Аватара пользователя
Count_Raven
Местный Бог
Сообщения: 2535
Зарегистрирован: 14 окт 2004, 18:48
Контактная информация:

Re: PHP sizeof

Сообщение Count_Raven »

Gromozeka писал(а):не мне надо скачать html-ку определить построчно ее размер, найти нужное, и вырезать это от туда...
можно возпользоваться preg_match, но надо с регулярными выражениями разбираться...

2 Паша твой вариант тоже не канает...

ЗЫ хочу таблицу с погодой к себе на локальный сайт таскать... с загруженной страницей нормально работает, это когда $source = file('pogoda1.html'); а вот в варианте $source = file_get_contents($url); не хочет... конечно можно и с wget юзать, но хочется именно так...
Да блин, легко это все, у меня на сайте у одной конторы импорт-экспорт из текстовых файлов в базу.
Там теми же самыми проблемами занимаюсь.

У тебя правда мой алгоритм полностью не подойдет, у меня файлы локальные. Нужно функцию написать всего одну дополнительную, чтобы с УРЛа файл брать.

А не работает у тебя видимо из-за \r\n, сделай просто \n - сервак же под линухом, у него нет \r для перехода строки, это у меня просто файлы виндовые парсились.

Поставь \n и должно заработать.
Аватара пользователя
Count_Raven
Местный Бог
Сообщения: 2535
Зарегистрирован: 14 окт 2004, 18:48
Контактная информация:

Re: PHP sizeof

Сообщение Count_Raven »

Короче если это тоже не помогло, то через пару часов освобожусь и напишу тебе функцию ту самую.
MaSe

Re: PHP sizeof

Сообщение MaSe »

не помогло :(
как я понял, по строкам split('\n',$source) не правильно разбивает... отсюда и косяки...
Аватара пользователя
Marug
UGUGUROV
UGUGUROV
Сообщения: 1142
Зарегистрирован: 21 окт 2003, 19:14
Откуда: Горно-Алтайск
Контактная информация:

Re: PHP sizeof

Сообщение Marug »

Обязательно разбивать на строки? с одной строкой можно?
MaSe

Re: PHP sizeof

Сообщение MaSe »

эээ... ну да в принципе мона и строку обработать...
Аватара пользователя
Count_Raven
Местный Бог
Сообщения: 2535
Зарегистрирован: 14 окт 2004, 18:48
Контактная информация:

Re: PHP sizeof

Сообщение Count_Raven »

Блин, да элементарно все, как я и говорил.

<?
$url= 'http://forums.gorny.ru/index.php';
$source_file = fopen($url, "rb");
$source_contents = stream_get_contents($source_file);
fclose($source_file);

$source_arr = split("\n", $source_contents);

echo sizeof($source_arr);

//for ($i = 0; $i < count($source_arr); $i++) echo $source_arr[$i];

?>

sizeof (или count) выведет число 764.

если последнюю строку откомментить, то выведет наш форум в браузер, только без каскадной таблицы стилей и картинок, так как путь уже относительно нашего скрипта.

НО!

Я вот думаю, чего ты чем попало занимашься?
Наш форум 100% валидный XHTML, поэтому ты можешь просто пропарсить его при помощи SimpleXML и не надо никаких регулярных выражений и других очень ресурсоемких приемом. Просто парси при помощи SimpleXML - буквально 10 строк кода и ты возьмешь необходимый тебе для выдирания из форума фрагмент. Пользуйтесь качественной валидной версткой - это же кайф.
MaSe

Re: PHP sizeof

Сообщение MaSe »

я немного подругому сделал

Код: Выделить всё

$url= 'http://gismeteo.ru/city/legacy/?city=5180&shift=0&print=1'; 
$begin_screen='<table>';
$end_screen='</table>'; 
$source = file_get_contents($url);

$k=strpos($source,$begin_screen)+strlen($begin_screen);
$m=strpos($source,$end_screen);
$source=substr($source,$k,$m-$k);
ЗЫ форум был в качестве примера взят
Аватара пользователя
gil
Злой гик
Сообщения: 3192
Зарегистрирован: 31 окт 2006, 16:22

Re: PHP sizeof

Сообщение gil »

Count_Raven писал(а):Наш форум 100% валидный XHTML, поэтому ты можешь просто пропарсить его при помощи SimpleXML и не надо никаких регулярных выражений и других очень ресурсоемких приемом. Просто парси при помощи SimpleXML - буквально 10 строк кода и ты возьмешь необходимый тебе для выдирания из форума фрагмент. Пользуйтесь качественной валидной версткой - это же кайф.
готов поспорить.. 9 ошибок..
http://validator.w3.org/check?uri=http: ... ne&group=0
MaSe

Re: PHP sizeof

Сообщение MaSe »

гы, гы... нету ошибок уже... :) вроде тег IMG закрывать не обязательно, лана закрыл... ошибки исчезли...
Аватара пользователя
Count_Raven
Местный Бог
Сообщения: 2535
Зарегистрирован: 14 окт 2004, 18:48
Контактная информация:

Re: PHP sizeof

Сообщение Count_Raven »

Gromozeka писал(а):гы, гы... нету ошибок уже... :) вроде тег IMG закрывать не обязательно, лана закрыл... ошибки исчезли...
Как это не обязательно!!! Ты что! Все теги, даже одиночные должны быть закрыты!
Это в HTML не обязательно, а в XHTML ВСЕ ОБЯЗАТЕЛЬНО ЗАКРЫВАТЬ!

Код: Выделить всё

<br/>
<img ..... />
<input ..... />
Аватара пользователя
Count_Raven
Местный Бог
Сообщения: 2535
Зарегистрирован: 14 окт 2004, 18:48
Контактная информация:

Re: PHP sizeof

Сообщение Count_Raven »

Gromozeka писал(а):я немного подругому сделал

Код: Выделить всё

$url= 'http://gismeteo.ru/city/legacy/?city=5180&shift=0&print=1'; 
$begin_screen='<table>';
$end_screen='</table>'; 
$source = file_get_contents($url);

$k=strpos($source,$begin_screen)+strlen($begin_screen);
$m=strpos($source,$end_screen);
$source=substr($source,$k,$m-$k);
ЗЫ форум был в качестве примера взят

Блин, так тебе погоду надо было с GISMETEO?
У меня давно такой скрипт есть и работает на сайтах, написан именно при помощи XML-экспорта на GISMETEO и SimpleXML парсера.

Код: Выделить всё

<style type="text/css">
<!--
body { margin: 50px; }
td { border-top: #f1f1f1 1px solid; border-right: #f1f1f1 1px solid; font: 12px Arial; }
-->
</style>
<?
$source = 'http://informer.gismeteo.ru/xml/29634_1.xml'; // получаем данные
$weekday = array('','Вс','Пн','Вт','Ср','Чт','Пт','Сб'); // день недели
$month = array('','Янв','Фев','Мар','Апр','Май','Июн','Авг','Сен','Окт','Ноя','Дек'); // месяц
$tod = array('ночь','утро','день','вечер'); // время суток
$cloudiness = array('ясно', 'малооблачно', 'облачно', 'пасмурно'); // облачность
$precipitation = array(4=>'дождь', 5=>'ливень', 6=>'снег', 7=>'снег', 8=>'гроза', 9=>'нет данных', 10=>'без осадков'); //осадки
$xmlstr = '';

$fp = fopen($source, 'r'); // открываем
if ( $fp ) {
while (!feof($fp)) $xmlstr.= fread($fp, 8192); // читаем
$xml = new SimpleXMLElement($xmlstr);
//echo '<pre>'; var_dump($xml->REPORT); echo '</pre>'; // тестим данные
?>

<div style="display:block; width:75%;">
<table width="250" border="0" cellpadding="5" cellspacing="0" style="float:left; border-left:#f1f1f1 1px solid; border-bottom:#f1f1f1 1px solid;">
 <tr><td height="70" align="center" valign="middle"><? $town = $xml->REPORT->TOWN[0]; echo '<b>Погода '.urldecode($town['sname']).'</b><br>(широта: '.$town['latitude'].'º, долгота: '.$town['longitude'].'°)'; ?></td></tr>
 <tr><td valign="top">Облачность</td></tr>
 <tr><td valign="top">Осадки</td></tr>
 <tr><td valign="top">Атмосферное давление, мм.рт.ст.</td></tr>
 <tr><td valign="top">Температура воздуха, °C</td></tr>
 <tr><td valign="top">Ветер, метр/сек</td></tr>
 <tr><td valign="top">Влажность воздуха, %</td></tr>
 <tr><td valign="top">Комфорт, °C</td></tr>    
</table>
<?
foreach ($xml->REPORT->TOWN->FORECAST as $f) {
 echo '<table width="100" border="0" cellpadding="5" cellspacing="0"  style="float:left; border-bottom: #f1f1f1 1px solid;">'.
  '<tr><td height="70" align="center">'.$tod[intval($f['tod'])].'<br>'.
  $f['day'].' '.$month[intval($f['month'])].'<br>'.
  $weekday[intval($f['weekday'])].'</td></tr>'.
  '<tr><td align="center">'.$cloudiness[intval($f->PHENOMENA['cloudiness'])].'</td></tr>'.
  '<tr><td align="center">'.$precipitation[intval($f->PHENOMENA['precipitation'])].'</td></tr>'.
  '<tr><td align="center">'.$f->PRESSURE['min'].' - '.$f->PRESSURE['max'].'</td></tr>'.
  '<tr><td align="center">'.$f->TEMPERATURE['min'].' - '.$f->TEMPERATURE['max'].'</td></tr>'.
  '<tr><td align="center">'.$f->WIND['min'].' - '.$f->WIND['max'].', '.$f->WIND['direction'].'</td></tr>'.
  '<tr><td align="center">'.$f->RELWET['min'].' - '.$f->RELWET['max'].'%</td></tr>'.
  '<tr><td align="center">'.$f->HEAT['max'].' - '.$f->HEAT['min'].'</td></tr>';
echo '</table>';
}
?>
<? } ?>
</div>
Ответить

Вернуться в «Программирование, администрирование и софт»