0

How to convert a single dimension array into multi dimensional array or into a nested <li> HTML.

Below is the array which I need in nested <li> based on parent_id

Array (
[5] => Array
    (
        [data_id] => 5
        [data_parent] => 4
        [data_level] => 
        [data_prefix] => 
        [data_title] => Assets
        [data_link] => 0
    )

[57] => Array
    (
        [data_id] => 57
        [data_parent] => 5
        [data_level] => 
        [data_prefix] => 
        [data_title] => Fixed Assets
        [data_link] => 0
    )

[52] => Array
    (
        [data_id] => 52
        [data_parent] => 5
        [data_level] => 
        [data_prefix] => 
        [data_title] => Asset Two
        [data_link] => 1
    )

[51] => Array
    (
        [data_id] => 51
        [data_parent] => 5
        [data_level] => 
        [data_prefix] => 
        [data_title] => Assset ONE
        [data_link] => 1
    )

[48] => Array
    (
        [data_id] => 48
        [data_parent] => 4
        [data_level] => 
        [data_prefix] => 
        [data_title] => Expenses
        [data_link] => 0
    )

[50] => Array
    (
        [data_id] => 50
        [data_parent] => 48
        [data_level] => 
        [data_prefix] => 
        [data_title] => Expense One
        [data_link] => 1
    )

[49] => Array
    (
        [data_id] => 49
        [data_parent] => 48
        [data_level] => 
        [data_prefix] => 
        [data_title] => Expense One
        [data_link] => 1
    )

[58] => Array
    (
        [data_id] => 58
        [data_parent] => 57
        [data_level] => 
        [data_prefix] => 
        [data_title] => Vehicles
        [data_link] => 1
    )

)
Rahul
  • 18,271
  • 7
  • 41
  • 60

2 Answers2

0

you can create multi dimensional array use foreach and sort

$newArray = [];

foreach($array as $value) {
    $newArray[$value['data_parent']][] = $value;
}

var_dump($newArray);
Mike Foxtech
  • 1,633
  • 1
  • 6
  • 7
  • Thanks dear, it worked for the first level. But i need the recursive multi D array. something like ASSET ->FIXED ASSETS -->VEHICLES – Talha Nazir Jul 08 '19 at 20:53
0

You can first create parent child recursive array,

function buildTree(array $elements, $options = [
    'parent_id_column_name' => 'parent_id',
    'children_key_name'     => 'children',
    'id_column_name'        => 'id',
], $parentId = 0) {
    $branch = [];
    foreach ($elements as $element) {
        if ($element[$options['parent_id_column_name']] == $parentId) {
            $children = buildTree($elements, $options, $element[$options['id_column_name']]);
            if ($children) {
                $element[$options['children_key_name']] = $children;
            }
            $branch[] = $element;
        }
    }
    return $branch;
}
// 4 as first parent is
$temp = buildTree($arr, [
    'parent_id_column_name' => 'data_parent',
    'children_key_name'     => 'children',
    'id_column_name'        => 'data_id'], 4);

Then recursively apply ul and li to above array,

// 4 as first parent is
$temp = buildTree($arr, [
    'parent_id_column_name' => 'data_parent',
    'children_key_name'     => 'children',
    'id_column_name'        => 'data_id'], 4);
function printTree($tree)
{
    if (!is_null($tree) && count($tree) > 0) {
        echo '<ul>';
        foreach ($tree as $node) {
            // you can use whole $node here including all values of each node
            echo '<li>' . $node['data_title'];
            if (!empty($node['children'])) {
                printTree($node['children']);
            }
            echo '</li>';
        }
        echo '</ul>';
    }
}
printTree($temp);

Demo

Output:-

<ul>
    <li>Assets<ul>
            <li>Fixed Assets<ul>
                    <li>Vehicles</li>
                </ul>
            </li>
            <li>Asset Two</li>
            <li>Assset ONE</li>
        </ul>
    </li>
    <li>Expenses<ul>
            <li>Expense One</li>
            <li>Expense One</li>
        </ul>
    </li>
</ul>

I took reference of answers link1 and link2.

Rahul
  • 18,271
  • 7
  • 41
  • 60