Answer the question
In order to leave comments, you need to log in
How to correctly write a recursive PHP function for comparing website URLs?
Hello!
I can't figure out how to correctly compose a recursive function, what's the problem - I don't understand.
The essence of the function is that we pass into it a list of exception site URLs and the URL that we get from the object. If the URL that we get from the object matches the URL from the list of exclusion sites - we increase the iterator, get the next URL from the object and compare again, until either we compare either 9 URLs, or we get the value of the iterator when there are no matches .
The actual function itself:
/*
@param $exSiteArr (array) массив с URL'ами сайтов (пример: array("insufficientscotty.com", "www.avtosnab66.ru","dailydropcap.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", "dailydropcap.com");
$searchImg = new MyClass($productName);
// из $searchImg получаем такие URL'ы: "insufficientscotty.com", "dailydropcap.com", "dailydropcap.com", "b1.simple.ru"
// первые 3 URL попадают под условие проверки, поэтому должны получить в итоге 4ый URL ("b1.simple.ru")
$iter = checkUrl($sitesExceptionsGetCSV, $searchImg);
// по идеи мы должны получить $iter = 3, но получаем $iter = 1
Answer the question
In order to leave comments, you need to log in
It is not necessary to do such things with recursive functions.
What do you need to do? How many elements of the second array are in the first?
PS
Guys, what kind of recursion are you talking about if the return of the checkUrl function in the checkUrl itself is not used? :)
array_diff is what you need.
php.net/manual/en/function.array-diff.php
Can you comment on why and how then it would be correct to do this?
No, I need to end up with a URL from an object that is not in the exclusion list.
This code is taken out of context and slightly simplified.
I am iterating over a lot of products, by name, using $searchImg = new MyClass($productName);
I'm looking for image URLs. It is necessary to receive only those URLs that are not in the exclusion list.
Everything seems to be correct, here I made a couple of changes
/*
@param $exSiteArr (array) массив с URL'ами сайтов (пример: array("insufficientscotty.com", "www.avtosnab66.ru","dailydropcap.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;
}
}
}
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question