PHP – как использовать рекурсию

В данном примере мы выведем дерево элементов из массива. Будем использовать рекурсивное обращение функции к самой себе.

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

Вот и всё, надеюсь вы всё поняли, и с рекурсией больше вопросов не будет 🙂

автор: Dmitriy

З 2011 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

2 коментаря

  1. Спасибо за великолепную статью. Перелопатил много. Лучше чем здесь нигде не видел объяснения! Спасибо

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *