Сложно и интересно - рекурсивный обход массива

программирование программы php алгоритмы

Очень прошу не игнорировать данное сообщение и помочь!
Суть в том чтобы сформировать массив ссылок типа
[страница-1 ] = /*ссылается на*/ 2, 3, 4;
[страница-2 ] = 1, 3, 4;
...
[страница-4 ] = 1, 2, 3;

следующим способом:
$url = 'http://www.site.ru';
$links = get_links($url);
а дальше зайти на каждую найденную ссылку и сделать тоже самое!!

Очень важно! Уже 2 недели не могу сделать!

Примечание:
Maelstorm, спасибо за ответ!
для анализа ссыки я использую функцию parse_url($url)
для получения контента страницы и использую функцию file_get_contents($url)
для ищу ссылки в тексте по регулярному выражению
$pattern = '#<a\s+href\s*=\s*["\']?([^\s>]+?)["\']?[.]*?>(.*?)</a>#i';
preg_match_all($pattern2, $content, $matches);

Проблема в том чтобы делать все эти операции рекурсивно, при этом не парситьодни и те же страницы два раза.
Заранее спасибо!

Примечание:
Сделал как сказали, неиче не выходит((((

$this->all[$this->url] = array();
$ok = $this->cycle();
if($ok){
header('Content-Type: text/plain');
print_r($this->links);
}

function cycle(){
foreach($this->all as $key => $val){
if(!isset($this->complete[$key])){
$tmp = $this->get_links($key);
$this->links[$key] = $tmp[$key];
foreach($this->links[$key] as $l_key => $l_val){
if(!isset($this->all[$l_val])){
$this->all[$l_val] = array();
}
}
$this->complete[$key] = array();
}
}
foreach($this->all as $key => $val){
if(!isset($this->complete[$key])){
$this->cycle();
}else{
return true;
}
}
}

function get_links($link){

$content = file_get_contents($link);
// ссылка, href, анкор
$pattern = '#<a\s+href\s*=\s*["\']?([^\s>]+?)["\']?[.]*?>(.*?)</a>#i';
// ссылка, href
$pattern2 = '#<a[^>]*href=["\'\s]*([^>"\'\s]+)["\'\s]*[^>]*>#i';
$count = preg_match_all($pattern2, $content, $matches);
$pages[$link] = $matches[1];

return $pages;
}
Ответы:
Очень приятно помогать зная, что вы уже сделали какие-то усилия для решения задачи.
Поэтому - что именно вам неясно и нужно обьяснить?
"Очень важно, сложно, интересно" - это конечно замечательно и весьма эмоционально, но две недели ж, блджад...
Алгоритм такой:
Создайте две таблицы в БД. В одной (links) id, link, is_processed. В другой (jumps) parent_id, link_id.
>Сделал как сказали, неиче не выходит((((
$this->all[$this->url] = array(); // это что за конструкция? :)
И рекурсия здесь не нужна вообще, скорее while


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.