@ArtKuz

Как правильно составить рекурсивную PHP-функцию для сравнения URL'ов сайтов?

Всем привет!
Никак не получается корректно составить рекурсивную функцию, в чем проблема - не пойму.
Суть функции в том, что мы передаем в неё список URL'ов сайтов-исключений и URL, который получаем из объекта. Если URL, который получаем из объекта совпадает с URL'ом из списка сайтов-исключений - увеличиваем итератор, получаем следующий URL из объекта и снова сравниваем, до тех пор пока не сравним либо 9 URL'ов, либо не получим значение итератора когда соответствий нет.
Собственно сама функция:

/*
@param $exSiteArr (array) массив с URL'ами сайтов (пример: array("insufficientscotty.com", "www.avtosnab66.ru","dailydro‌​pcap.com"...))
@param $element (object) из этого объекта получаем URL сайта, который будем сравнивать со списком URL'ов из массива выше
@param $iterator (number) число, номер какой картинки нам нужно получить из $element (0-8)
return number возвращаем последнее значение итератора
*/
function checkUrl($exSiteArr, $element, $iterator = 0) {
if ($iterator > 8) { // в объекте храниться максимум 9 url'ов (0-8)
    return 8;
} else {
    $siteUrl = $element->getSiteUrl($element->getUrl($iterator)); // получаем URL из объекта ("insufficientscotty.com", "dailydropcap.com"...)
    // echo $iterator; // 0, 1, 2, 3
    foreach ($exSiteArr as $siteEx) { // перебор URL'ов из списка исключений 
        if ((mb_strripos($siteEx, $siteUrl) !== false)) { // если URL, который получаем из объекта совпадает с URL'ом из списка сайтов-исключений
            $iterator++; // увеличиваем значение итератора
            checkUrl($exSiteArr, $element, $iterator); // вызываем эту же функцию рекурсивно, но с увеличенным итератором
        } else {
            continue;
        }
    }
}
// echo $iterator; // 3, 2, 1
return $iterator; // должны вернуть максимальный итератор
}


Пример использования функции:

$sitesExceptionsGetCSV = array("insufficientscotty.com", "www.avtosnab66.ru", "dailydro‌​pcap.com");
$searchImg = new MyClass($productName);
// из $searchImg получаем такие URL'ы: "insufficientscotty.com", "dailydro‌​pcap.com", "dailydro‌​pcap.com", "b1.simple.ru"
// первые 3 URL попадают под условие проверки, поэтому должны получить в итоге 4ый URL ("b1.simple.ru")

$iter = checkUrl($sitesExceptionsGetCSV, $searchImg);
// по идеи мы должны получить $iter = 3, но получаем $iter = 1


В функции прописал пример изменений итератора для конкретного примера.
Помогите пожалуйста правильно составить рекурсивную функцию!
  • Вопрос задан
  • 3476 просмотров
Решения вопроса 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Не надо такие вещи делать рекурсивными функциями.
Вам что нужно сделать? Подсчитать сколько элементов второго массива входят в первый?

PS
Ребят, о какой нафиг рекурсии вы говорите, если возврат функции checkUrl в самой checkUrl не используется ? :)

UPD
array_diff Вам нужен.
php.net/manual/ru/function.array-diff.php
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@ArtKuz Автор вопроса
Можно прокомментировать почему и как тогда будет правильно это делать?
Нет, мне нужно получать в итоге URL из объекта, которого нет в списке исключений.
Этот код вырван из контекста и немного упрощен.
Я перебираю множество продуктов, по названию, с помощью $searchImg = new MyClass($productName); я ищу URL-ы изображений. Нужно, получать только те URL'ы, которых нет в списке исключений.
Ответ написан
Всё выглядит вроде правильно, вот внёс пару изменений
/*
@param $exSiteArr (array) массив с URL'ами сайтов (пример: array("insufficientscotty.com", "www.avtosnab66.ru","dailydro‌​pcap.com"...))
@param $element (object) из этого объекта получаем URL сайта, который будем сравнивать со списком URL'ов из массива выше
@param $iterator (number) число, номер какой картинки нам нужно получить из $element (0-8)
return number возвращаем последнее значение итератора
*/
function checkUrl($exSiteArr, $element, $iterator = 0) {
if ($iterator > 8) { // в объекте храниться максимум 9 url'ов (0-8)
    return 8;
} else {
    $siteUrl = $element->getSiteUrl($element->getUrl($iterator)); // получаем URL из объекта ("insufficientscotty.com", "dailydropcap.com"...)
    // echo $iterator; // 0, 1, 2, 3
    foreach ($exSiteArr as $siteEx) { // перебор URL'ов из списка исключений 
        if ((mb_strripos($siteEx, $siteUrl) !== FALSE)) { // если URL, который получаем из объекта совпадает с URL'ом из списка сайтов-исключений
            return checkUrl($exSiteArr, $element, $iterator++); // вызываем эту же функцию рекурсивно, но с увеличенным итератором
        } else {
            continue;
        }
    }
}
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы