Помогите разобраться с функциями php.

F
На сайте с 06.02.2012
Offline
138
403

Подскажите чайнику.

Написал функцию f1 ($url) в которой получаю массив $links всех ссылок со страницы по адресу $url.

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

Но вне функции php уже не понимает переменную $links , пишет ошибку Undefined variable $links, хотя она уже вроде как обработана функцией.

Получается, что после знака }, который закрывает функцию, переменные, которые в ней использовались уже не существуют, кроме самой $url?

А как мне использовать полученный массив линков $links?

F9
На сайте с 13.04.2008
Offline
104
#1

Перед объявлением функции напишите:

$links = array();

В самой функции, сразу после открывающего {

global $links;

Не шедевр архитектуры Web-приложений, конечно, но должно работать. А на досуге почитайте что-нибудь про области видимости переменных (variable scope) в PHP

php.developer
На сайте с 22.11.2010
Offline
94
#2

Используйте return в функции


function f1($url){
//some code

return $links;
}

$links1 = f1('http://yandex.ru/');
$links2 = f1('http://google.com/');

Про global забудьте, колхоз и пережиток прошлого.

F
На сайте с 06.02.2012
Offline
138
#4

php.developer,

return $links; уже ошибку не пишет. Но и линки не выводит...

В моём случе в цикле foreach массива echo $link; не выводятся.

Если убираю функцию совсем - всё выводится

Где я что упустил?



$site = "/";
echo f1 ($site);
$links = array();
function f1 ($site)
{

$html = file_get_contents($site);

//echo $html;



/* $html - некий html-код некой страницы, \n - это переход на новую строку (верстальщики иногда это делают) */
//$html = "Текст <a href='page1.html'>ссылка</a> и снова <a hREF ="page2.html" title=''>ссылка</a> конец";
/* Вызываем функцию, которая все совпадения помещает в массив $matches */
preg_match_all("/<[Aa][\s]{1}[^>]*[Hh][Rr][Ee][Ff][^=]*=[ '\"\s]*([^ \"'>\s#]+)[^>]*>/", $html, $matches);
$urls = $matches[1]; // Берём то место, где сама ссылка (благодаря группирующим скобкам в регулярном выражении)
/* Выводим все ссылки */

$n=0;
//$links = array();
for ($i = 0; $i < count($urls); $i++):
if (stristr($urls[$i], $site)) {$urls[$i]=str_replace ($site, '', $urls[$i]);}
if (stristr($urls[$i],'../')) {$urls[$i]=str_replace ('../', '', $urls[$i]);}
if (stristr($urls[$i],'://')) {$urls[$i]=""; }

if ($urls[$i] != '') {
$n++;
$a = $urls[$i];
//echo $a."<br>";
$links[] = $a;
}
endfor;
return $links;
} // КОНЕЦ ФУНКЦИИ

// убираем повторяющиеся Урлы
$links = array_unique ($links);
foreach ($links as $link)
{
echo $link;
//echo $urles= '<a href="'.$site.$link.'">'. $site.$link.'</a>' ;
}

siv1987
На сайте с 02.04.2009
Offline
427
#5
fordzon:
Где я что упустил?
fordzon:
echo f1 ($site);

Еще раз посмотрите пример из поста 3. Где у вас присваивается результат функции?

F
На сайте с 06.02.2012
Offline
138
#6
siv1987:
echo f1 ($site);

Этим я вызываю функцию для обработки страницы $site.

В процессе выполнения функции получаю массив внутри.

А как быть с $links ?

Торможу.

---------- Добавлено 20.05.2013 в 17:28 ----------

Ага... Понял!

$links = f1($site);

Спасибо!!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий