Evgenii Malikov
Evgenii Malikov

Reputation: 437

convert indexed multidimensional array to associative multidimensional array

I have an indexed array with nested categories like this:

array (
  0 => 
  array (
    'name' => 'Furniture',
    'id' => 'b3cdd1k',
    'content' => 
    array (
      0 => 
      array (
        'name' => 'Tables',
        'id' => 'nw24ga3',
        'content' => 
        array (
          0 => 
          array (
            'name' => 'Wooden tables',
            'id' => 'ba5lgaz',
          ),
          1 => 
          array (
            'name' => 'Glass tables',
            'id' => 'rqt91gz',
          ),
        ),
      ),
    ),
  ),
  1 => 
  array (
    'name' => 'Lamps',
    'id' => 'vb1a4nf',
  ),
  2 => 
  array (
    'name' => 'Doors',
    'id' => 'a5l4gal',
    'content' => 
    array (
      0 => 
      array (
        'name' => 'Entrance doors',
        'id' => 'qwg30fb',
      ),
    ),
  ),
)

Is there elegant way to convert it to associative array (where keys are id's) and keep nesting structure?

After conversion I excepting something like this:

array (
  'b3cdd1k' => 
  array (
    'name' => 'Furniture',
    'content' => 
    array (
      'nw24ga3' => 
      array (
        'name' => 'Tables',
        'content' => 
        array (
          'ba5lgaz' => 
          array (
            'name' => 'Wooden tables',
          ),
          'rqt91gz' => 
          array (
            'name' => 'Glass tables',
          ),
        ),
      ),
    ),
  ),
  'vb1a4nf' => 
  array (
    'name' => 'Lamps',
  ),
  'a5l4gal' => 
  array (
    'name' => 'Doors',
    'content' => 
    array (
      'qwg30fb' => 
      array (
        'name' => 'Entrance doors',
      ),
    ),
  ),
)

Upvotes: 1

Views: 97

Answers (1)

IVO GELOV
IVO GELOV

Reputation: 14259

You could try this - not the most elegant, but seems to work:

function convert(&$a)
{
  $result = Array();
  foreach($a as $k=>&$v)
  {
    $result[$v['id']]['name'] = $v['name'];
    if(is_array($v['content'])) $result[$v['id']]['content'] = convert($v['content']);
  }
  return $result;
}

if(count($array) != 0) $result = convert($array);

Upvotes: 1

Related Questions