Массив содержит цикл через ссылку?

Дали задачу:
необходимо написать функцию, которая получает на вход массив и определяет ...
В случае если массив содержит цикл, например, через ссылку, функция должна вернуть false.


Вопрос: что значит массив содержит цикл через ссылку? Как массив может содержать цикл? И как понять через ссылку? Разве по значению массива можно определить оно идет по ссылке или нет?
  • Вопрос задан
  • 1218 просмотров
Решения вопроса 1
@kimisa Автор вопроса
Не самое лучшее решение, но считаю самое оптимальное
$a[] = &$a;
if(strpos(print_r($a,1),'*RECURSION*') !== FALSE) echo 1;
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
twobomb
@twobomb
Первая идея которая пришла в голову, бред конечно не правильно(с точки зрения здравого смысла), но все же
echo hasRec($arr) ? "тут рекурсия":"тут нет рекурсий";

function hasRec($arr){
    ob_start();
    var_dump($arr);
    return preg_match("/^\s*\*RECURSION\*\s*$/umi",ob_get_clean());
}
Ответ написан
zabudkin
@zabudkin
Инженер-системотехник, программист, админ, ТПУ!!!!
Да блин походу вопрос звучит чуть иначе, функция ли это или нет. Вот ответ:
if( is_callable( $func ) )
{
   echo "ЦИКЛ, функция и прочее";
}


$func - это сама переменная, либо её имя "переменная".

Можно например сделать так:
$vasya="VasyaLOH";
$vasya("Вот и имя");

function VasyaLOH($moeimya)
{
echo "Мы тут $moeimya!";
}
Ответ написан
sergiks
@sergiks Куратор тега PHP
♬♬
Предлагаю такой вариант потестировать. serialize() обозначает ссылку как "R:123" и для определения, есть ли в принципе ссылка, можно искать подстроку "R:" в сериализованном представлении массива или объекта.
Но это пока никак не проверяет, является ли ссылка циклической..
function hasCyclicRef($subject) {
	return FALSE === strpos(serialize($subject), 'R:');
}


$arr = (object) ['one' => 1, 'two' => 2];
$arr->me = &$arr;

var_dump( hasCyclicRef($arr));
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы