[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Цикл в массиве - это что?
Страницы: 1, 2
Diakon
Добрый день!
Попалось странное задание:
Необходимо написать функцию, которая получает на вход массив и определяет уровень вложенности полученного массива.
В случае если массив содержит цикл, например, через ссылку, функция должна вернуть false

C определением вложенности массива особых проблем нет - рекурсия в помошь:

function returnArrayLvl($arr){
$lvl = 0;
foreach ($arr as $val){
if (is_array($val)){
$lvl_arr = returnArrayLvl($val);
$lvl = ($lvl > $lvl_arr) ? $lvl : $lvl_arr;
}
}

return ++$lvl;
}

Возвращает уровень вложенности.
А вот вторая часть поставила в тупик. Может кто в курсе, что это за массив содержит цикл, например, через ссылку

Заранее спасибо!
Ron
Ну насколько я могу понять это задание, имеется ввиду циклическая ссылка, которая обратит рекурсию в бесконечность.

В элементарном случае:
$arr = ['a' => &$arr];
Что-то вроде того.

Как предположение, не проверял что будет на практике.

Diakon
Цитата (Ron @ 1.02.2017 - 18:20)
Ну насколько я могу понять это задание, имеется ввиду циклическая ссылка, которая обратит рекурсию в бесконечность.

В элементарном случае:
$arr = ['a' => &$arr];
Что-то вроде того.

Как предположение, не проверял что будет на практике.

хмм..
не встречал раньше такого. но да - перерасход памяти мгновенный.
Хм... а как проверить то можно что это именно такой массив?
Всмысле вот моя функция, которую привел выше, как сделать проверку что значение - не ссылка?
Ron
Очень странная задача.

Короче то ли слишком мудреная, то ли в условии имеется ввиду совершенно другое. Это вообще под PHP или из С прилетела с легкой руки препода/интервьювера.

Я примерно представляю как может выглядеть убедительное решение, но публиковать его в утвердительной форме не стану, потому что оно обладает серьезными недостатками над которыми нужно долго думать. И разрешимы ли они вообще в рамках PHP.

Просто распознать ссылку, как таковую, можно в конце-концов, хотя на PHP это лютый гемор. А вот что делать если она ссылается просто на другой массив или переменную? Тогда такой алгоритм будет срабатывать неверно, будет определять циклическую ссылку, где ее нет. Там еще много нюансов, например если ссылка ведет просто на вложенный массив? То она тоже не будет циклической. Кстати и глубина массива будет может быть определена не верно.

И вообще что означает "например ссылка" а какие еще варианты возможны закольцевать массив? Неужели имеется ввиду что просто хардкодно повторяющиеся вглубь массивы тоже являются "циклами"?

Вообщем тут нужно копать в сторону построения своеобразной карты обхода массивов с четкой уникальной идентификацией каждого из них (слоя, образно говоря). Не знаю, по хэшу какому-нибудь. А дальше смотреть какие в ветках уже встречались и как/где именно, вроде breadcrumbs. Возможно сюда получится подтянуть теорию графов типа того.

Будет значительно проще, если понять откуда взялась такая задача, может быть удастся уточнить условие по контексту. Например, если это из С, то там несколько проще, поскольку можно легко "вычислить" ссылку (указатель).
bestxp
print_r($arr) и ищем взглядом *recursive xD
Diakon
Вот так сделал.
Функция либо вернет вложенность массива либо false если есть зацикливанте

function returnArrayLvl($arr)
{
$lvl = 0;
foreach ($arr as $val){
if (is_array($val)){
if(isReference($val) === true){
return false;
}

$lvl_arr = returnArrayLvl($val);
$lvl = ($lvl > $lvl_arr) ? $lvl : $lvl_arr;
}
}

return ++$lvl;
}

function isReference($variable)
{
$variable = array($variable);
$arg = func_get_arg(0);
$isRef = isset($arg[0]) && $arg === array($variable[0]);
return $isRef;
}

$arr = [&$arr];
echo returnArrayLvl($arr);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.