[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Цикл в массиве - это что?
Страницы: 1, 2
Ron
Цитата (twin @ 2.02.2017 - 23:45)
Вот покажи "правильное" решение? Это сложно, если вообще возможно - сам писал.

Это сложно, для реализации на PHP. Именно сам процесс определения ссылки (указателя) и куда ведет. Последнее вообще возможно ли, даже через дикие дебаги, ХЗ. =). На С этих проблем нет, можно довольно просто забабахать детектор колец. Поэтому я предполагаю, что задача СИшная и с какого ее задали под PHP в такой формулировке? Если это не собеседование

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

Если рассматривать в качестве вопроса на собеседовании, то последняя редакция очень даже неплохая. Хотя, мне не понятно, зачем гнать проверку через всю рекурсию, проще сделать, своего рода, контроллер и разбить на 2: сам детектор и поиск глубины. Получится 3 функции, что лучше с точки зрения clean code. Или условие через счетчик и статическую переменную, если настаивают на одной. Там же на первом выполнении все-равно идет прогонка через весь массив целиком. На итерациях мы не получим ничего нового, кроме потери ресурсов. Значительных, в случае большого дерева.

twin
Цитата (Ron @ 2.02.2017 - 21:30)
Это сложно, для реализации на PHP.
Вот потому и говорю - каков вопрос, таков и ответ. Если бы было нужно проверить знание графов или тому подобное, то вопрос нужно было ставить так, что бы на него можно было ответить в этом свете. А так какие претензии... Функция есть? Есть. False на зацикливание возвращает? Возвращает. Что еще не так? :)

Цитата (Ron @ 2.02.2017 - 21:30)
Хотя, мне не понятно, зачем гнать проверку через всю рекурсию
Я исходил из задания:
Цитата (Diakon @ 1.02.2017 - 17:48)
Необходимо написать функцию
То есть одну функцию. И так пытался нивелировать это проверкой типа аргумента.

На практике конечно нужно смотреть по месту. Если массивы предполагаются небольшие, то накладные расходы на организацию дополнительных функций могут свести на нет профит от разделения. А так то да, согласен. Раздельно было бы чище.

Цитата (Ron @ 2.02.2017 - 21:30)
Или условие через счетчик и статическую переменную, если настаивают на одной
Можно конечно триггером оформить, если уж вообще досконально рыться, согласен. Впрочем задача чисто теоретическая, это не суть и не столь уж важно.
function returnArrayLvl($arr)
{
static $trg = true;

if($trg)
{
json_encode($arr);
$trg = false;

if(json_last_error() === JSON_ERROR_RECURSION)
return false;

}

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

return ++$lvl;
}


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

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