PDA

View Full Version : سوال: ایجاد ساختار درختی



desatir7316
یک شنبه 06 اردیبهشت 1394, 16:50 عصر
سلام دوستان
این آرایه رو تصور کنید :


$row = [
['id' => 1, 'parent_id' => 0, 'title' => 'A'],
['id' => 2, 'parent_id' => 1, 'title' => 'B'],
['id' => 3, 'parent_id' => 2, 'title' => 'C'],
['id' => 4, 'parent_id' => 0, 'title' => 'D'],
];


با کمک تابع بازگشتی زیر به صورت ارایه درختی در اومده :



function buildTree(array $elements, $parentId = 0) {
$branch = array();

foreach ($elements as $element) {
if ($element['parent_id'] == $parentId) {
$children = buildTree($elements, $element['id']);
if ($children) {
$element['children'] = $children;
}
$branch[] = $element;
}
}

return $branch;
}
$tree = buildTree($row);


الان یه آرایه به شکل زیر بهم میده :


[
0 => [
'id' => 1
'parent_id' => 0
'title' => 'A'
'children' => [
0 => [
'id' => 2
'parent_id' => 1
'title' => 'B'
'children' => [
0 => [
'id' => 3
'parent_id' => 2
'title' => 'C'
]
]
]
]
]
1 => [
'id' => 4
'parent_id' => 0
'title' => 'D'
]
]


حالا می خوام تبدلش کنم به یه ارایه به شکل زیر:


// id => title
[
1 => 'A',
2 => '-B',
3 => '--D',
4 => 'E'
]




ممنون می شم راهنمایی کنید

reza_alie
یک شنبه 06 اردیبهشت 1394, 17:37 عصر
سلام خدمت شما


<?php
$datas=array(
array(
'id' => 1,
'title'=>'book1',
'parentid'=>0
),
array(
'id' => 2,
'title'=>'book2',
'parentid'=> 1
),
array(
'id' => 3,
'title'=>'book3',
'parentid'=> 0
),

);

function buildTree($data,$prID=0,$q=NULL){
$branch = array();
foreach ($data as $key => $element) {
$bool=!array_key_exists($element['parentid'], $data) && !$q;
if($element['parentid']==$prID || $bool){
$children = buildTree($data, $element['id'],TRUE);
if ($children) {
$element['children'] = $children;
}
$branch[] = $element;
}
}
return $branch;
}

function printTree($branch,$space=-1,$w='<li>'){
$q=0;
if($w != ''){
$w=$w.'-';
}
foreach ($branch as $value) {
$i=$space;

$q++;
echo $w.$q.'-'.$value['title']."<br>";
if(isset($value['children']) && is_array($value['children'])){
$i=$i++;
printTree($value['children'],$i,$w.$q);
}
}
}

$ndata=buildTree($datas);

printTree($ndata);



موفق باشی

abolfazl-z
یک شنبه 06 اردیبهشت 1394, 22:08 عصر
function sequential($nodes, $depth='')
{
$oa = array();
foreach($nodes as $node)
{
$oa[] = $depth.$node['title'];
if(isset($node['children']))
foreach(sequential($node['children'],$depth.'-') as $internalNode)
$oa[] = $internalNode;
}
return $oa;
}

desatir7316
سه شنبه 08 اردیبهشت 1394, 07:39 صبح
ابوالفضل جان مرسی، فقط یه مشکلی هست. id ها بهم میریزه
می خوام دقیقا به ترتیبی که توی آرایه اولی هست باشن چون توی دیتابیس ذخیره می شن :


$row = [
['id' => 1, 'parent_id' => 0, 'title' => 'A'],
['id' => 2, 'parent_id' => 1, 'title' => 'B'],
['id' => 3, 'parent_id' => 2, 'title' => 'C'],
['id' => 4, 'parent_id' => 0, 'title' => 'D'],
];



ممنون

desatir7316
چهارشنبه 09 اردیبهشت 1394, 09:32 صبح
up..........

abolfazl-z
پنج شنبه 10 اردیبهشت 1394, 18:21 عصر
چند روزی نتم قطع بود.

متوجه نشدم خروجی تابع sequential را می گویید ؟