Доброго дня вам!
Столкнулся с проблемой, от которой уже мозги кипят:
В первом случае получаю данные из бд, вот
var_dump() данных:
spoilerarray(3) {
[0]=>
array(8) {
["id"]=>
int(2)
["name"]=>
string(20) "Информация"
["set_id"]=>
int(1)
["is_category"]=>
int(1)
["code"]=>
string(11) "information"
["sort"]=>
int(10)
["parent_id"]=>
int(0)
["level"]=>
int(0)
}
[1]=>
array(8) {
["id"]=>
int(3)
["name"]=>
string(9) "О нас"
["set_id"]=>
int(1)
["is_category"]=>
int(1)
["code"]=>
string(5) "about"
["sort"]=>
int(10)
["parent_id"]=>
int(2)
["level"]=>
int(1)
}
[2]=>
array(8) {
["id"]=>
int(12)
["name"]=>
string(14) "История"
["set_id"]=>
int(1)
["is_category"]=>
int(0)
["code"]=>
string(7) "history"
["sort"]=>
int(10)
["parent_id"]=>
int(3)
["level"]=>
int(2)
}
}
Вот для сравнения
var_dump() рабочего массива:
spoilerarray(7) {
[0]=>
array(4) {
["id"]=>
int(1)
["parent_id"]=>
string(0) ""
["name"]=>
string(4) "NODE"
["payment"]=>
int(1)
}
[1]=>
array(4) {
["id"]=>
int(2)
["parent_id"]=>
int(1)
["name"]=>
string(6) "NODE 1"
["payment"]=>
int(1)
}
[2]=>
array(4) {
["id"]=>
int(4)
["parent_id"]=>
int(2)
["name"]=>
string(8) "NODE 1-1"
["payment"]=>
int(0)
}
[3]=>
array(4) {
["id"]=>
int(5)
["parent_id"]=>
int(4)
["name"]=>
string(10) "NODE 1-1-1"
["payment"]=>
int(0)
}
[4]=>
array(4) {
["id"]=>
int(6)
["parent_id"]=>
int(4)
["name"]=>
string(10) "NODE 1-1-2"
["payment"]=>
int(0)
}
[5]=>
array(4) {
["id"]=>
int(3)
["parent_id"]=>
int(1)
["name"]=>
string(6) "NODE 2"
["payment"]=>
int(0)
}
[6]=>
array(4) {
["id"]=>
int(7)
["parent_id"]=>
int(3)
["name"]=>
string(8) "NODE 2-1"
["payment"]=>
int(0)
}
}
Сам код:
function getBranches($arr, $id) {
$childrenArr = array();
foreach($arr as $item) {
if ($item['parent_id']==$id) {
$childrenArr[] = $item;
}
}
return $childrenArr;
}
function getBranch($arr, $id) {
$branch = array();
foreach($arr as $item) {
if ($item['id'] == $id) {
$branch[$item['id']] = $item;
$branches = getBranches($arr, $id);
$children = array();
foreach($branches as $child) {
$b = getBranch($arr, $child['id']);
foreach ($b as $token => $child) {
$children[$child['id']] = $child;
}
}
$branch[$item['id']]['children'] = $children;
break;
}
}
if (count($branch)==0) echo 'WARNING '.$id;
return $branch;
}
(ссылка на
песочницу)
Для рабочего варианта
var_dump(getBranch($users,1))
выглядит так:
spoilerarray(1) {
[1]=>
array(5) {
["id"]=>
int(1)
["parent_id"]=>
string(0) ""
["name"]=>
string(4) "NODE"
["payment"]=>
int(1)
["children"]=>
array(2) {
[2]=>
array(5) {
["id"]=>
int(2)
["parent_id"]=>
int(1)
["name"]=>
string(6) "NODE 1"
["payment"]=>
int(1)
["children"]=>
array(1) {
[4]=>
array(5) {
["id"]=>
int(4)
["parent_id"]=>
int(2)
["name"]=>
string(8) "NODE 1-1"
["payment"]=>
int(0)
["children"]=>
array(2) {
[5]=>
array(5) {
["id"]=>
int(5)
["parent_id"]=>
int(4)
["name"]=>
string(10) "NODE 1-1-1"
["payment"]=>
int(0)
["children"]=>
array(0) {
}
}
[6]=>
array(5) {
["id"]=>
int(6)
["parent_id"]=>
int(4)
["name"]=>
string(10) "NODE 1-1-2"
["payment"]=>
int(0)
["children"]=>
array(0) {
}
}
}
}
}
}
[3]=>
array(5) {
["id"]=>
int(3)
["parent_id"]=>
int(1)
["name"]=>
string(6) "NODE 2"
["payment"]=>
int(0)
["children"]=>
array(1) {
[7]=>
array(5) {
["id"]=>
int(7)
["parent_id"]=>
int(3)
["name"]=>
string(8) "NODE 2-1"
["payment"]=>
int(0)
["children"]=>
array(0) {
}
}
}
}
}
}
}
Т.е. создаёт правильную структуру.
А вот для
var_dump(getBranch($users2,12))
данных из базы - берёт только активный элемент:
spoilerarray(1) {
[12]=>
array(9) {
["id"]=>
int(12)
["name"]=>
string(14) "История"
["set_id"]=>
int(1)
["is_category"]=>
int(0)
["code"]=>
string(7) "history"
["sort"]=>
int(10)
["parent_id"]=>
int(3)
["level"]=>
int(2)
["children"]=>
array(0) {
}
}
}
В чём может быть подвох? Весь вечер убил - на пойму в чём может быть дело :(
Или подскажите рабочий код поиска родителей по полю
parent_id.