1

Is there something like an explode feature for array keys to convert a flat array into a multi-dimensional/hierarchical array?

For example:

Suppose I have array data in this format:

$arr[object/filename.txt] => Array ( ... ) 
$arr[object/filename.jpg] => Array ( ... ) 

Which I would like to convert to:

$arr[object][filename.txt] => Array ( ... )
$arr[object][filename.jpg] => Array ( ... ) 
ina
  • 19,167
  • 39
  • 122
  • 201
  • Does this answer your question? [Convert dot syntax like "this.that.other" to multi-dimensional array in PHP](https://stackoverflow.com/questions/9635968/convert-dot-syntax-like-this-that-other-to-multi-dimensional-array-in-php) – Jeto Oct 23 '20 at 08:47
  • I don't think anything like this exist natively. But create a solution for this is matter of 3 lines. – Frankich Oct 23 '20 at 08:52

2 Answers2

0

You can try this way:

$arr = [
    'object/filename.txt' => [],
    'object/filename.jpg' => [],
    'object/filename.png' => [],
];

foreach ($arr as $key => $value) {
    $arr_key = explode('/', $key);
    $arr[][$arr_key[0]][$arr_key[1]] = $value;
    unset($arr[$key]);
}

print_r($arr);

Output:

Array
(
    [0] => Array
        (
            [object] => Array
                (
                    [filename.txt] => Array
                        (
                        )

                )

        )

    [1] => Array
        (
            [object] => Array
                (
                    [filename.jpg] => Array
                        (
                        )

                )

        )

    [2] => Array
        (
            [object] => Array
                (
                    [filename.png] => Array
                        (
                        )

                )

        )

)
Dmitry Leiko
  • 3,970
  • 3
  • 25
  • 42
0

When your keys become dynamic then arrays can be built using a recursive.

<?php

$arr = [
    'object1/object2/filename.txt' => [ "Hello" ,"Hi" ],
    'object/filename.jpg' => [ "Foo" , "bar"],
    'object1/filename.png' => [],
];

$result = [];
foreach ($arr as $key => $item) {
    $exploded = explode('/', $key);
    $result[] = makeRecursiveArray( $exploded, $item );
}

var_dump( $result );

function makeRecursiveArray( $keys, $item )
{
    $arr = [];
    if( count($keys) == 1 )
        {
            $arr [$keys[0] ] = $item;
            return $arr;
        }
    else{
        $key =  array_shift( $keys);
        $arr [ $key ] = makeRecursiveArray( $keys, $item );
    }
    return $arr;
}
Al-Amin
  • 596
  • 3
  • 16