0

I have an array like this:

array(
      array(id => 7, parent_id => 0, name => Current Assets)
      array(id => 8, parent_id => 0, name => Fixed Assets)
      array(id => 18, parent_id => 7, name => Assets)
      array(id => 38, parent_id => 18, name => Receivable)
      array(id => 38, parent_id => 18, name => Inventory)
      array(id => 39, parent_id => 0, name => Landed Cost Of Inventory)
      array(id => 40, parent_id => 38, name => Jazz Cash)
      array(id => 41, parent_id => 39, name => Advance to Vendors)
)

Now I need some efficient way to convert this into tree structure like this.

array(
      array(id => 7, parent_id => 0, name => Current Assets, level=>0)
      array(id => 8, parent_id => 0, name => Fixed Asset, level => )
      array(id => 18, parent_id => 7, name => Assets, level => 1)
      array(id => 38, parent_id => 18, name => Inventory, level => 2)
      array(id => 39, parent_id => 0, name => Landed Cost Of Inventory, level => 0)
      array(id => 40, parent_id => 38, name => Jazz Cash, level => 3)
      array(id => 41, parent_id => 39, name => Advance to Vendors, level => 1)
)

I no need to add them left or right, I just need the simple levels that I will pass to jQgrid.

0

1 Answer 1

2

Collect all ids in the order of parent -> child in an array where parent_id is the key and it has an array of all child IDs. Second step is to just traverse the tree and assign the ranks.

<?php

function assignLevels(&$data){
    $kids = [];

    foreach($data as $d){
        $kids[ $d['parent_id'] ] = $kids[ $d['parent_id'] ] ?? [];
        $kids[ $d['parent_id'] ][] = $d['id'];
    }
    
    $data = array_column($data, null, 'id');
    traverseTree($kids, 0, $data);
    $data = array_values($data);
}


function traverseTree($kids, $id, &$data, $level = 0){
    foreach($kids[ $id ] as $sub_id){
        $data[ $sub_id ]['level'] = $level;
        if(isset($kids[ $sub_id ] )) traverseTree($kids, $sub_id, $data, $level + 1);
    }
}

assignLevels($data);

print_r($data);

Online Demo

Sign up to request clarification or add additional context in comments.

10 Comments

It only creat up to level 1, like see here Array ( [id] => 29 [parent_id] => 23 [name] => Output Tax [hasChild] => 1 [parent_name] => [value] => 15480 [level] => 1 ) Array ( [id] => 31 [parent_id] => 29 [name] => Sales tax (Output) [hasChild] => 0 [parent_name] => [value] => 120000 [level] => 1 ) level of array id 31 should be 2
@TahirLilla Can you var_export() and paste the input array here?
0: {id: '7', parent_id: '0', name: 'Current Assets', value: 16000, level: 0} 1: {id: '39', parent_id: '23', name: 'Advance from Customers', value: 0, level: 1} 2: {id: '42', parent_id: '15', name: 'Cost- Wallpaper', value: 0, level: 1} 3: {id: '35', parent_id: '15', name: 'Carbonated Drink Cost', value: 0, level: 1} 4: {id: '16', parent_id: '0', name: 'Operating Expenses', value: 0, level: 0} 5: {id: '15', parent_id: '0', name: 'Cost of Good Sold', value: 0, level: 0}
16: {id: '29', parent_id: '23', name: 'Output Tax', value: 15480, level: 1}
it worked! i just sort array and then pass it , Thanks
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.