Как я могу сделать массив деревьев из строки?

У меня есть массив со следующими записями

   Array
(
[0] => Array
(
[id] => 76
[category_name] => Baby & children
[category_path] => 76
)

[1] => Array
(
[id] => 77
[category_name] => Baby bathing & potting
[category_path] => 76,77
)

[2] => Array
(
[id] => 78
[category_name] => Baby baths
[category_path] => 76,77,78
)

[3] => Array
(
[id] => 79
[category_name] => Baby safety
[category_path] => 76,79
)

[4] => Array
(
[id] => 80
[category_name] => Baby video monitors
[category_path] => 76,79,80
)

[5] => Array
(
[id] => 81
[category_name] => Socket covers
[category_path] => 76,79,81
)

[6] => Array
(
[id] => 82
[category_name] => Baby sleeping & bedding
[category_path] => 76,82
)

[7] => Array
(
[id] => 83
[category_name] => Baby sleeping bags
[category_path] => 76,82,83
)

[8] => Array
(
[id] => 84
[category_name] => Feeding &  diapering & nursing
[category_path] => 76,84
)

[9] => Array
(
[id] => 85
[category_name] => Baby scales
[category_path] => 76,84,85
)

[10] => Array
(
[id] => 86
[category_name] => Bottle nipples
[category_path] => 76,84,86
)

[11] => Array
(
[id] => 87
[category_name] => Changing mats
[category_path] => 76,84,87
)

[12] => Array
(
[id] => 88
[category_name] => Feeding bottles
[category_path] => 76,84,88
)

[13] => Array
(
[id] => 89
[category_name] => Toys & accessories
[category_path] => 76,89
)

[14] => Array
(
[id] => 90
[category_name] => Children toy figures
[category_path] => 76,89,90
)

)

Как я могу создать дерево из этого массива.

Я хочу создать меню с этими категориями (записями).

малыш & дети> купание ребенка & заливка

малыш & дети> купание ребенка & potting> Детские ванны

малыш & дети> купание ребенка & potting> Безопасность детей

1

Решение

Согласно вашему заданному массиву:

$array =  array(
0 => Array
(
'id' => 76,
'category_name' => "Baby & children",
'category_path' => "76",
),

1 => Array
(
'id' => 77,
'category_name' => "Baby bathing & potting",
'category_path' => "76,77",
),

2 => Array
(
'id' => 78,
'category_name' => "Baby baths",
'category_path' => "76,77,78"),

3 => Array
(
'id' => 79,
'category_name' => "Baby safety",
'category_path' => "76,79"),

4 => Array
(
'id' => 80,
'category_name' => "Baby video monitors",
'category_path' => "76,79,80"),

5 => Array
(
'id' => 81,
'category_name' => "Socket covers",
'category_path' => "76,79,81"),

6 => Array
(
'id' => 82,
'category_name' => "Baby sleeping & bedding",
'category_path' => "76,82"),

7 => Array
(
'id' => 83,
'category_name' => "Baby sleeping bags",
'category_path' => "76,82,83"),

8 => Array
(
'id' => 84,
'category_name' => "Feeding &  diapering & nursing",
'category_path' => "76,84"),

9 => Array
(
'id' => 85,
'category_name' => "Baby scales",
'category_path' => "76,84,85"),

10 => Array
(
'id' => 86,
'category_name' => "Bottle nipples",
'category_path' => "76,84,86"),

11 => Array
(
'id' => 87,
'category_name' => "Changing mats",
'category_path' => "76,84,87"),

12 => Array
(
'id' => 88,
'category_name' => "Feeding bottles",
'category_path' => "76,84,88"),

13 => Array
(
'id' => 89,
'category_name' => "Toys & accessories",
'category_path' => "76,89"),

14 => Array
(
'id' => 90,
'category_name' => "Children toy figures",
'category_path' => "76,89,90")
);

Вы можете использовать что-то вроде этого:

createMenu($array, getRootItems($array), $menu);
echo $menu;

/*
Recursive method to create the menu
*/
function createMenu(&$sourceArray, $menuElements, &$menu, $dept=0)
{
$dept++;

$menu .= '<ul>';
if(count($menuElements) > 0)
{
foreach($menuElements as $menuElement)
{
$menu .= '<li>'.$menuElement['category_name'];

$childItems = getChildItems($sourceArray, $menuElement['id'], $dept);
if(count($childItems) > 0)
{
createMenu($sourceArray, $childItems, $menu, $dept);
}
$menu .= '</li>';
}
}
$menu .= '</ul>';
}

/*
Function to get all root elements for the first level menu items
*/
function getRootItems($menuElements)
{
$rootItems = array();
foreach($menuElements as $arrayItem)
{
if(str_replace(',','',$arrayItem['category_path']) == $arrayItem['id'])
{
$rootItems[$arrayItem['id']] = $arrayItem;
}
}

return $rootItems;
}

/*
Function get the children items of the a certain id
*/
function getChildItems(&$sourceArray, $parentId, $dept)
{
$childItems = array();

foreach($sourceArray as $arrayItem)
{
if(!isset($arrayItem['category_array']) || !empty($arrayItem['category_array']))
{
$arrayItem['category_array'] = explode(',',$arrayItem['category_path']);
}

if(in_array($parentId,$arrayItem['category_array']) && count($arrayItem['category_array']) == $dept+1)
{
$childItems[$arrayItem['id']] = $arrayItem;
}
}

return $childItems;
}

Выход:

Baby & children
Baby bathing & potting
Baby baths

Baby safety
Baby video monitors
Socket covers

Baby sleeping & bedding
Baby sleeping bags

Feeding & diapering & nursing
Baby scales
Bottle nipples
Changing mats
Feeding bottles

Toys & accessories
Children toy figures

Обратите внимание, что это не то же самое, что вы сказали в своем вопросе. Это потому, что структура вашего массива не соответствует желаемому результату. Например. если ты хочешь Baby & children > Baby bathing & potting > Baby safety вам нужно добавить идентификатор 77 к category_path «Детская безопасность» (типа «Детские ванны»).

1

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

Я знаю, что это немного грязно, но это работает.

$arrayMenu = array(
array('id' => 76, 'category_name' => 'Baby & children', 'category_path' => '76' ),
array('id' => 77, 'category_name' => 'Baby bathing & potting', 'category_path' => '76,77' ),
array('id' => 78, 'category_name' => 'Baby baths', 'category_path' => '76,77,78' )
);

$tmp = array();

foreach($arrayMenu as $item)
{
$tmp[$item['id']] = $item['category_name'];
}

$keys = array_keys($tmp);
$values = array_values($tmp);

foreach($arrayMenu as $item)
{
echo str_replace($keys, $values, str_replace(',',' > ', $item['category_path'])).'<br>';
}
0

Переформатируйте массив при его создании. Создайте многомерный массив (массив внутри массива), чтобы вкладывать группы меню в их основные группы.

array
(
'Baby & children' => array
(
'Baby bathing & potting' => array (
'Baby baths' = 1,
'Baby safety' = 2
)
)
)

базовый макет массива.
Тогда вы можете использовать:

foreach (array as $key => $value) {
echo $key;
foreach ($value as $subkey => $subvalue) {
echo $subkey;
foreach ($subvalueas $index => $data) {
echo $index;
}
}
}

Для доступа к каждому ключу и его значениям. Базовый пример, который не предоставляет никаких ключей для «запоминания» последнего выбранного при смене страницы и т. Д.

Организация массива в логическое дерево перед его использованием экономит время и упрощает получение их в правильном порядке.

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