I have a table with id, parent_id and name fields,
a parent can have many child but child have only one parent.
On fetching, the array is look like
Array
(
[0] => Array
(
[id] => 1
[parent_id] => 0
[name]=>firstName
)
[1] => Array
(
[id] => 2
[parent_id] => 1
[name]=>childFirstName
)
[2] => Array
(
[id] => 3
[parent_id] => 0
[name]=>SecondName
)
[3] => Array
(
[id] => 4
[parent_id] => 3
[name]=>childSecondName
)
)
From this table , i want a flat array, which should be look like this..
//The key of array is the id of table row and the value corresponding to id is parent_name >name
Array
(
[1]=>[firstName],// [row_id]=>[name with parent]
[2]=>[firstName>childFirstName],
[3]=>[secondName],
[4]=>[secondName>childSecondName]
)
<?php
$arr=array(
array("id" => 1, "parent_id" => 0, "name"=>"firstName"),
array("id" => 2, "parent_id" => 1, "name"=>"childFirstName"),
array("id" => 3, "parent_id" => 0, "name"=>"SecondName"),
array("id" => 4, "parent_id" => 3, "name"=>"childSecondName")
);
class test
{
var $arr=array();
function get_name($id)
{
$str='';
if(isset($this->arr[$id]))
{
$parent_id=$this->arr[$id]['parent_id'];
if($parent_id!=0) $str=$this->get_name($parent_id).'>';
$str.=$this->arr[$id]['name'];
}
return $str;
}
function convert($arr)
{
foreach($arr as $row)
{
$this->arr[$row['id']]=$row;
}
reset($this->arr);
$res=array();
foreach($this->arr as $id=>$row)
{
$res[$id]=$this->get_name($id);
}
return $res;
}
}
$c=new test();
$res=$c->convert($arr);
print_r($res);
Lets say you get $items into $i and your new array is $n in your foreach, use:
foreach($items as $i){
$p = $i['parent_id'];
$n[$i['id']]=($p == 0) ? [$i['name']]: [$n[$p][0]=>$i['name']];
}
This will work only if a parent has no parents. As a more precautious code,
foreach($items as $i){
$p = $i['parent_id'];
if($p == 0){ //if no parent
$n[$i['id']]=[$i['name']];
continue;
} // if has parent from now on...
$k = array_keys($n[$p]); // if parent has a parent we have to
$k = $k[0]; // get the correct key for name
$n[$i['id']]=[$n[$p][$k]=>$i['name']];
}
So that the code above will work at multiple hierarchy levels.