@GrigoryMorozov

Как через PHP выводить неограниченную вложенность элементов в массиве?

Собственно. Имеется вытянутый через VK API JSON со всеми сообщениями пользователя. Этот JSON декодируется и в итоге получается многомерный массив. В этом массиве каждый конкретный массив -- одно сообщение. В сообщении, помимо текста, может быть пересылаемое сообщение. В пересылаемом сообщении -- ещё пересылаемые сообщения (т. е. вложенность фактически бесконечна). И в каждом сообщении (как в обычном, так и в пересланном) может быть приложение (или несколько приложений).

Для примера:
Для получения доступа к приложениям в обычном сообщении нужно обратиться:
$arr[номер_сообщения]["attachments"][номер_вложения_в_сообщении][тип_вложения][элемент_со_ссылкой_на_вложение]
Для приложений в пересланном сообщении:
$arr[номер_сообщения]["fwd_messages"][номер_пересланного_сообщения]["attachments"][номер_вложения_в_сообщении][тип_вложения][элемент_со_ссылкой_на_вложение]

Если что -- https://vk.com/dev/message.

Должен получаться HTML с иерархической структурой (блок с сообщением, внутри которого блок с пересланным сообщением, а внутри этого блока -- ещё один; в каждом таком блоке -- по изображению). В общем, то представление, которое есть у сообщений на самом сайте.

Проблема состоит в том, как всё это обрабатывать. Если уровней 1 или 2 -- всё просто. А вот если этих уровней может быть бесконечно много -- уже проблема.

Как это реализовать, учитывая возможную неограниченную вложенность?
  • Вопрос задан
  • 277 просмотров
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Проблема состоит в том, как всё это обрабатывать.


Не совсем так. У вас сейчас проблема с формализацией задачи, что должно выходить в итоге.

А вот если этих уровней может быть бесконечно много -- уже проблема.


Курите в сторону графов и поиска в ширину.
Ответ написан
@StalkerBetaPro
это рабочий js код по теме:
var fwdfun = function (fwds,level=1) {
	try {
	for(var i in fwds){
		const fwd = fwds[i];
		var qo = ">".repeat(level);
		 console.log(qo+fwd.num);
	if(fwd.arr){
		 fwdfun(fwd.arr,level + 1);
	}
	}
}catch(error){
	console.error(error);
}
}

fwdfun(obj);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы