Преобразовать плоский массив во вложенный массив, используя материализованный путь

У меня есть несколько категорий, которые мне нужно преобразовать во вложенный массив (дерево). Я использую материализованный путь для создания дерева и работаю в PHP. Вот print_r того, что у меня есть:

Array
(
[0] => Array
(
[_id] => mac
[name] => Mac
[path] => null
)

[1] => Array
(
[_id] => ipod
[name] => iPod
[path] => null
)

[2] => Array
(
[_id] => imac
[name] => iMac
[path] => ,mac,
)

[3] => Array
(
[_id] => imac2001
[name] => iMac 2001
[path] => ,mac,imac,
)

[4] => Array
(
[_id] => imac2002
[name] => iMac 2002
[path] => ,mac,imac,
)

[5] => Array
(
[_id] => imac2003
[name] => iMac 2003
[path] => ,mac,imac,
)

)

Я пытался сделать это, но я теряюсь в самой идее рекурсивной функции.

ОБНОВИТЬ :

Вот что я хотел бы получить в конечном итоге:

Array
(
[0] => Array
(
[_id] => mac
[name] => Mac
[path] => null
[children] =>
[0] => Array
(
[_id] => imac
[name] => iMac
[path] => ,mac,
[children] =>
[0] => Array
(
[_id] => imac2001
[name] => iMac 2001
[path] => ,mac,imac,
)

[1] => Array
(
[_id] => imac2002
[name] => iMac 2002
[path] => ,mac,imac,
)

[2] => Array
(
[_id] => imac2003
[name] => iMac 2003
[path] => ,mac,imac,
)
)
)

[1] => Array
(
[_id] => ipod
[name] => iPod
[path] => null
)
)

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

0

Решение

Я нашел решение. Это работает для меня, так что вот оно:

<?php

$categories = Array
(
[0] => Array
(
["_id"] => "mac"["name"] => "Mac"["path"] => null
)

[1] => Array
(
["_id"] => "ipod"["name"] => "iPod"["path"] => null
)

[2] => Array
(
["_id"] => "imac"["name"] => "iMac"["path"] => ",mac,")

[3] => Array
(
["_id"] => "imac2001"["name"] => "iMac 2001"["path"] => ",mac,imac,")

[4] => Array
(
["_id"] => "imac2002"["name"] => "iMac 2002"["path"] => ",mac,imac,")

[5] => Array
(
["_id"] => "imac2003"["name"] => "iMac 2003"["path"] => ",mac,imac,")
)

$categoriesNested = sortTree($categories);

function sortTree(&$categories, $parent = null)
{
$result = array();

foreach($categories as $key => $cat)
{
if($parent == null)
{
$temp = $cat;
unset($categories[$key]);
$temp["children"] = $this->sortTree($categories, $cat);
$result[] = $temp;
}
else
{
$tempPath = array_values(array_filter(explode(',', $cat["path"])));
$directParent = array_pop($tempPath);
if ($parent["_id"] == $directParent)
{
$temp = $cat;
unset($categories[$key]);
$temp["children"] = $this->sortTree($categories, $cat);
$result[] = $temp;
}
}
}

if (empty($result))
return null;
else
return $result;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]