<?php
$sourceArray = array(
array('ID' => 705, 'NAME' => 'Телефоны и гаджеты', 'DEPTH_LEVEL' => 1),
array('ID' => 706, 'NAME' => 'Смартфоны', 'DEPTH_LEVEL' => 2),
array('ID' => 5586, 'NAME' => 'Аксессуары для гаджетов', 'DEPTH_LEVEL' => 2),
array('ID' => 715, 'NAME' => 'Аксессуары для телефонов', 'DEPTH_LEVEL' => 3),
array('ID' => 716, 'NAME' => 'Чехлы для смартфонов', 'DEPTH_LEVEL' => 4),
array('ID' => 5536, 'NAME' => 'Чехлы для Apple', 'DEPTH_LEVEL' => 5),
array('ID' => 5539, 'NAME' => 'Чехлы для Samsung', 'DEPTH_LEVEL' => 5),
array('ID' => 3010, 'NAME' => 'Защитные стекла для телефонов', 'DEPTH_LEVEL' => 3),
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1)
);
$sourceArray2 = array(
array('ID' => 705, 'NAME' => 'Телефоны и гаджеты', 'DEPTH_LEVEL' => 1),
array('ID' => 706, 'NAME' => 'Смартфоны', 'DEPTH_LEVEL' => 2),
array('ID' => 5586, 'NAME' => 'Аксессуары для гаджетов', 'DEPTH_LEVEL' => 2),
array('ID' => 715, 'NAME' => 'Аксессуары для телефонов', 'DEPTH_LEVEL' => 3),
array('ID' => 716, 'NAME' => 'Чехлы для смартфонов', 'DEPTH_LEVEL' => 4),
array('ID' => 5536, 'NAME' => 'Чехлы для Apple', 'DEPTH_LEVEL' => 5),
array('ID' => 5539, 'NAME' => 'Чехлы для Samsung', 'DEPTH_LEVEL' => 5),
array('ID' => 3010, 'NAME' => 'Защитные стекла для телефонов', 'DEPTH_LEVEL' => 3),
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1),
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2),
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1),
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2),
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2),
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1),
);
$expect = [
[
'ID' => 705,
'NAME' => 'Телефоны и гаджеты',
'DEPTH_LEVEL' => 1,
'CHILD' => [
[
'ID' => 706,
'NAME' => 'Смартфоны',
'DEPTH_LEVEL' => 2
],
[
'ID' => 5586,
'NAME' => 'Аксессуары для гаджетов',
'DEPTH_LEVEL' => 2,
'CHILD' => [
[
'ID' => 715,
'NAME' => 'Аксессуары для телефонов',
'DEPTH_LEVEL' => 3,
'CHILD' => [
[
'ID' => 716,
'NAME' => 'Чехлы для смартфонов',
'DEPTH_LEVEL' => 4,
'CHILD' => [
[
'ID' => 5536,
'NAME' => 'Чехлы для Apple',
'DEPTH_LEVEL' => 5
],
[
'ID' => 5539,
'NAME' => 'Чехлы для Samsung',
'DEPTH_LEVEL' => 5
]
]
]
]
],
[
'ID' => 3010,
'NAME' => 'Защитные стекла для телефонов',
'DEPTH_LEVEL' => 3
]
]
]
]
],
[
'ID' => 660,
'NAME' => 'Компьютерная техника',
'DEPTH_LEVEL' => 1
]
];
$expect2 = [
[
'ID' => 705,
'NAME' => 'Телефоны и гаджеты',
'DEPTH_LEVEL' => 1,
'CHILD' => [
[
'ID' => 706,
'NAME' => 'Смартфоны',
'DEPTH_LEVEL' => 2
],
[
'ID' => 5586,
'NAME' => 'Аксессуары для гаджетов',
'DEPTH_LEVEL' => 2,
'CHILD' => [
[
'ID' => 715,
'NAME' => 'Аксессуары для телефонов',
'DEPTH_LEVEL' => 3,
'CHILD' => [
[
'ID' => 716,
'NAME' => 'Чехлы для смартфонов',
'DEPTH_LEVEL' => 4,
'CHILD' => [
[
'ID' => 5536,
'NAME' => 'Чехлы для Apple',
'DEPTH_LEVEL' => 5
],
[
'ID' => 5539,
'NAME' => 'Чехлы для Samsung',
'DEPTH_LEVEL' => 5
]
]
]
]
],
[
'ID' => 3010,
'NAME' => 'Защитные стекла для телефонов',
'DEPTH_LEVEL' => 3
]
]
]
]
],
[
'ID' => 660,
'NAME' => 'Компьютерная техника',
'DEPTH_LEVEL' => 1,
'CHILD' => [
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2)
]
],
[
'ID' => 660,
'NAME' => 'Компьютерная техника',
'DEPTH_LEVEL' => 1,
'CHILD' => [
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2),
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2)
]
],
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1),
];
/* ----Рекурсивный кусок говна---- */
// function makeTree(array $arr){
// $parent_lvl = -1;
// $parent_index = -1;
// $res = [];
// foreach($arr as $index => $sub) {
// $lvl = $sub['DEPTH_LEVEL'];
// if ($index === 0 || $lvl === $parent_lvl) {
// $parent_index++;
// $res[$parent_index] = array_merge($sub, ['CHILD' => []] );
// $parent_lvl = $lvl;
// } elseif($lvl > $parent_lvl) {
// $res[$parent_index]['CHILD'][] = $sub;
// }
// }
// for($i = 0; $i < count($res); $i++ ){
// $res[$i]['CHILD'] = makeTree($res[$i]['CHILD']);
// }
// return $res;
// }
// function removeEmptyNodes(array $arr) {
// $count = count($arr);
// for($i = 0; $i < $count; $i++){
// $hasChildNode = isset($arr[$i]['CHILD']);
// $ChildNodeIsNotEmpty = $hasChildNode && count($arr[$i]['CHILD']) > 0;
// if($ChildNodeIsNotEmpty){
// $arr[$i]['CHILD'] = removeEmptyNodes($arr[$i]['CHILD']);
// } elseif ($hasChildNode) {
// unset($arr[$i]['CHILD']);
// }
// }
// return $arr;
// }
// $res = removeEmptyNodes(makeTree($sourceArray));
// $res2 = removeEmptyNodes(makeTree($sourceArray2));
// test($res, $expect); echo "\n";
// test($res2, $expect2); echo "\n";
// mijikaiDump($res); echo "\n";
// mijikaiDump($res2); echo "\n";
// var_dump($res); echo "\n\n\n\n\n";
// var_dump($res2);
/* ----Рекурсивный кусок говна---- */
/* ----Нерекурсивный сладкий рулет---- */
function makeTreeIter(array $arr){
$parents = []; // level => index
$res = [];
foreach($arr as $index=>$sub){
$lvl = $sub['DEPTH_LEVEL'];
if(isset($parents[$lvl-1])){
$i = &$parents[$lvl-1];
$i['CHILD'][] = $sub;
$lastIndex = count($i['CHILD'])-1;
$ref = &$i['CHILD'][$lastIndex];
$parents[$lvl] = &$ref;
} else {
$res[] = $sub;
$lastIndex = count($res)-1;
$ref = &$res[$lastIndex];
$parents[$lvl] = &$ref;
}
}
return $res;
}
$res = makeTreeIter($sourceArray);
$res2 = makeTreeIter($sourceArray2);
test($res, $expect); echo "\n";
test($res2, $expect2); echo "\n";
mijikaiDump($res); echo "\n";
mijikaiDump($res2); echo "\n";
var_dump($res); echo "\n\n\n\n\n";
var_dump($res2);
/* ----Нерекурсивный сладкий рулет---- */
function test($res, $expect) {
if($res === $expect) {
echo "OK: resuling and expected arrays match.";
} else {
throw new Exception("KO: resulting and expected arrays don't match.");
}
}
function mijikaiDump(array $arr, string $tab = ''):void {
foreach($arr as $val){
echo $tab.$val['DEPTH_LEVEL']." ".$val['NAME']."\n";
if(isset($val['CHILD'])) {
mijikaiDump($val['CHILD'],$tab.' ');
}
}
}
- Output for git.master, git.master_jit, rfc.property-hooks
- OK: resuling and expected arrays match.
OK: resuling and expected arrays match.
1 Телефоны и гаджеты
2 Смартфоны
2 Аксессуары для гаджетов
3 Аксессуары для телефонов
4 Чехлы для смартфонов
5 Чехлы для Apple
5 Чехлы для Samsung
3 Защитные стекла для телефонов
1 Компьютерная техника
1 Телефоны и гаджеты
2 Смартфоны
2 Аксессуары для гаджетов
3 Аксессуары для телефонов
4 Чехлы для смартфонов
5 Чехлы для Apple
5 Чехлы для Samsung
3 Защитные стекла для телефонов
1 Компьютерная техника
2 Компьютерная техника
1 Компьютерная техника
2 Компьютерная техника
2 Компьютерная техника
1 Компьютерная техника
array(2) {
[0]=>
array(4) {
["ID"]=>
int(705)
["NAME"]=>
string(34) "Телефоны и гаджеты"
["DEPTH_LEVEL"]=>
int(1)
["CHILD"]=>
array(2) {
[0]=>
array(3) {
["ID"]=>
int(706)
["NAME"]=>
string(18) "Смартфоны"
["DEPTH_LEVEL"]=>
int(2)
}
[1]=>
array(4) {
["ID"]=>
int(5586)
["NAME"]=>
string(44) "Аксессуары для гаджетов"
["DEPTH_LEVEL"]=>
int(2)
["CHILD"]=>
array(2) {
[0]=>
array(4) {
["ID"]=>
int(715)
["NAME"]=>
string(46) "Аксессуары для телефонов"
["DEPTH_LEVEL"]=>
int(3)
["CHILD"]=>
array(1) {
[0]=>
array(4) {
["ID"]=>
int(716)
["NAME"]=>
string(38) "Чехлы для смартфонов"
["DEPTH_LEVEL"]=>
int(4)
["CHILD"]=>
array(2) {
[0]=>
array(3) {
["ID"]=>
int(5536)
["NAME"]=>
string(23) "Чехлы для Apple"
["DEPTH_LEVEL"]=>
int(5)
}
[1]=>
array(3) {
["ID"]=>
int(5539)
["NAME"]=>
string(25) "Чехлы для Samsung"
["DEPTH_LEVEL"]=>
int(5)
}
}
}
}
}
[1]=>
array(3) {
["ID"]=>
int(3010)
["NAME"]=>
string(55) "Защитные стекла для телефонов"
["DEPTH_LEVEL"]=>
int(3)
}
}
}
}
}
[1]=>
array(3) {
["ID"]=>
int(660)
["NAME"]=>
string(39) "Компьютерная техника"
["DEPTH_LEVEL"]=>
int(1)
}
}
array(4) {
[0]=>
array(4) {
["ID"]=>
int(705)
["NAME"]=>
string(34) "Телефоны и гаджеты"
["DEPTH_LEVEL"]=>
int(1)
["CHILD"]=>
array(2) {
[0]=>
array(3) {
["ID"]=>
int(706)
["NAME"]=>
string(18) "Смартфоны"
["DEPTH_LEVEL"]=>
int(2)
}
[1]=>
array(4) {
["ID"]=>
int(5586)
["NAME"]=>
string(44) "Аксессуары для гаджетов"
["DEPTH_LEVEL"]=>
int(2)
["CHILD"]=>
array(2) {
[0]=>
array(4) {
["ID"]=>
int(715)
["NAME"]=>
string(46) "Аксессуары для телефонов"
["DEPTH_LEVEL"]=>
int(3)
["CHILD"]=>
array(1) {
[0]=>
array(4) {
["ID"]=>
int(716)
["NAME"]=>
string(38) "Чехлы для смартфонов"
["DEPTH_LEVEL"]=>
int(4)
["CHILD"]=>
array(2) {
[0]=>
array(3) {
["ID"]=>
int(5536)
["NAME"]=>
string(23) "Чехлы для Apple"
["DEPTH_LEVEL"]=>
int(5)
}
[1]=>
array(3) {
["ID"]=>
int(5539)
["NAME"]=>
string(25) "Чехлы для Samsung"
["DEPTH_LEVEL"]=>
int(5)
}
}
}
}
}
[1]=>
array(3) {
["ID"]=>
int(3010)
["NAME"]=>
string(55) "Защитные стекла для телефонов"
["DEPTH_LEVEL"]=>
int(3)
}
}
}
}
}
[1]=>
array(4) {
["ID"]=>
int(660)
["NAME"]=>
string(39) "Компьютерная техника"
["DEPTH_LEVEL"]=>
int(1)
["CHILD"]=>
array(1) {
[0]=>
array(3) {
["ID"]=>
int(660)
["NAME"]=>
string(39) "Компьютерная техника"
["DEPTH_LEVEL"]=>
int(2)
}
}
}
[2]=>
array(4) {
["ID"]=>
int(660)
["NAME"]=>
string(39) "Компьютерная техника"
["DEPTH_LEVEL"]=>
int(1)
["CHILD"]=>
array(2) {
[0]=>
array(3) {
["ID"]=>
int(660)
["NAME"]=>
string(39) "Компьютерная техника"
["DEPTH_LEVEL"]=>
int(2)
}
[1]=>
array(3) {
["ID"]=>
int(660)
["NAME"]=>
string(39) "Компьютерная техника"
["DEPTH_LEVEL"]=>
int(2)
}
}
}
[3]=>
array(3) {
["ID"]=>
int(660)
["NAME"]=>
string(39) "Компьютерная техника"
["DEPTH_LEVEL"]=>
int(1)
}
}
This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.
Active branches
Archived branches
Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page
preferences:
52 ms | 429 KiB | 5 Q