В данном примере мы выведем дерево элементов из массива. Будем использовать рекурсивное обращение функции к самой себе.
PHP пример рекурсии
Данная задача встречается довольно часто, особенно, при построении навигационных цепочек, меню, различных sitemaps и т.п.
Итак, для начала мы запишем простой массив с несколькими уровнями вложенности:
$tree = array( 'test0', 'test1' => array( 'test1.1', 'test1.2' => array( 'test1.2.1' ) ), 'test3' );
Видим что test0 и test3 не являются массивами, а вот в элементе массива test1 находится ассоциативный массив.
Значит, нам нужно проверять, является ли значение ключа массива, массивом 🙂
Надеюсь вы еще не запутались. Создадим функцию, и в ней вользопльемся is_array а после этого уже вызовем ее для нашей переменной $tree.
Собственно, сама функция:
function treeOut($tree) { $markup = ''; foreach ($tree as $branch => $twig) { $markup .= '<li>' . ((is_array($twig)) ? $branch . treeOut($twig) : $twig) . '</li>'; } return '<ul>' . $markup . '</ul>'; }
Как видим, в параметр функции мы передаем массив;
затем создаем пустую строку;
затем проходим циклом по элементам массива и через сокращенную запись if ? else : (он же, тернарный оператор) – проверяем является ли ключ массивом (ключ это $twig) и если является – запускаем функцию.
Ну и конечно в ответе функции мы просим вернуть через return полученное “дерево” элементов.
Полный код выглядит вот так:
<? function treeOut($tree) { $markup = ''; foreach ($tree as $branch => $twig) { $markup .= '<li>' . ((is_array($twig)) ? $branch . treeOut($twig) : $twig) . '</li>'; } return '<ul>' . $markup . '</ul>'; } $tree = array( 'test0', 'test1' => array( 'test1.1', 'test1.2' => array( 'test1.2.1' ) ), 'test3' ); echo treeOut($tree); ?>
А результат выполнения, так:
- test0
- test1
- test1.1
- test1.2
- test1.2.1
- test3
Вот и всё, надеюсь вы всё поняли, и с рекурсией больше вопросов не будет 🙂
Спасибо за великолепную статью. Перелопатил много. Лучше чем здесь нигде не видел объяснения! Спасибо
Спасибо за отзыв)