Задать вопрос
newpdv
@newpdv
Web-devekioer

«Бесконечно» вложенный массив

Добрый день!

Есть массив строк.
Нужно их вложить друг в друга.

$data = array('str1', 'str2', 'str3');

$array = array('str1', 'sub' => array('str2', 'sub' => 'str3'));

Как это можно сделать?
  • Вопрос задан
  • 4150 просмотров
Подписаться 2 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 6
@WEBIVAN
$data = array('str1', 'str2', 'str3', 'str4', 'str5');
$c=count($data)-1;
$a='';
if($c==0)
	$a=array($data[0]);
else
	for($i=$c;$i>=0;$i--)
	{
		if($i==$c)
			$a=$data[$i];
		else
			$a=array($data[$i],'sub'=>$a);
	}
Ответ написан
Комментировать
hell0w0rd
@hell0w0rd
Просто разработчик
function str_tree($arr, $i = 0)
{
	$res = array();
	if( isset($arr[$i]) ){
		$res[] = $arr[$i++];
		$res['sub'] = str_tree($arr, $i);
	}
	return $res;
}

Вот рекурсивный вариант
PS даже второй:
function str_tree($arr, $i = 0)
{
	return isset($arr[$i]) ? array($arr[$i++], 'sub' => str_tree($arr, $i)) : NULL;
}
Ответ написан
@WEBIVAN
После доп примеров получается, что изначальные пример у вас был некорректным, так как последний элемент теперь не строка а массив.
Для такого случая код немного проще
$data = array('str1', 'str2', 'str3', 'str4', 'str5');
$c=count($data)-1;
$a='';
for($i=$c;$i>=0;$i--)
{
	if($i==$c)
		$a=array($data[$i]);
	else
		$a=array($data[$i],'sub'=>$a);
}
print_r($a);
Ответ написан
Комментировать
MiXei4
@MiXei4
> Есть массив строк. Нужно ИХ вложить друг в друга.
Кого их? Строки? Массив строк куда-то? Строки в массив? :) Проблема не ясна.
Ответ написан
AterCattus
@AterCattus
Люблю быстрый backend
Можно «с конца» подойти:
$data = array('str1', 'str2', 'str3', 'str4');

$result = array(end($data));
while (false !== ($i = prev($data))) {
    $result = array($i, 'sub'=>$result);
}
Ответ написан
Комментировать
akral
@akral
Для подобного есть array_reduce:
$my = array_reduce(array_reverse($data), function($result, $item) {
        return array($item, 'sub' => $result);
}, array());


Непонятно, почему в задаче последний массив не имеет пустого sub, но если это и правда надо, то выделяем его специально:

$my = array_reduce(array_reverse(array_slice($data, 0, -1)), function($result, $item) {
        return array($item, 'sub' => $result);
}, array_slice($data, -1));
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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