Mr Hyde
Mr Hyde

Reputation: 3413

PHP arrays. There must be a simpler method to do this

I have this array in php returned from db

Array
(
    [inv_templates] => Array
        (
            [0] => Array
                (
                    [inven_subgroup_template_id] => 1
                    [inven_group] => Wires
                    [inven_subgroup] => CopperWires
                    [inven_template_id] => 1
                    [inven_template_name] => CopperWires6G
                    [constrained] => 0
                    [value_constraints] => 
                    [accept_range] => 2 - 16
                    [information] => Measured Manual
                )

            [1] => Array
                (
                    [inven_subgroup_template_id] => 1
                    [inven_group] => Wires
                    [inven_subgroup] => CopperWires
                    [inven_template_id] => 2
                    [inven_template_name] => CopperWires2G
                    [constrained] => 0
                    [value_constraints] => 
                    [accept_range] => 1 - 7
                    [information] => Measured by Automated Calipers
                )

        )

)

I need to output this kind of multidimensional stuff

Array
(
    [Wires] => Array
        (
            [inv_group_name] => Wires
            [inv_subgroups] => Array
                (
                    [CopperWires] => Array
                        (
                            [inv_subgroup_id] => 1
                            [inv_subgroup_name] => CopperWires
                            [inv_templates] => Array
                                (
                                    [CopperWires6G] => Array
                                        (
                                            [inv_name] => CopperWires6G
                                            [inv_id] => 1
                                        )

                                    [CopperWires2G] => Array
                                        (
                                            [inv_name] => CopperWires2G
                                            [inv_id] => 2
                                        )

                                )

                        )

                )

        )

)


I currently do this stuff

foreach ($data['inv_templates'] as $key => $value) {
        $processeddata[$value['inven_group']]['inv_group_name'] = $value['inven_group'];
        $processeddata[$value['inven_group']]['inv_subgroups'][$value['inven_subgroup']]['inv_subgroup_id'] = $value['inven_subgroup_template_id'];
        $processeddata[$value['inven_group']]['inv_subgroups'][$value['inven_subgroup']]['inv_subgroup_name'] = $value['inven_subgroup'];
        $processeddata[$value['inven_group']]['inv_subgroups'][$value['inven_subgroup']]['inv_templates'][$value['inven_template_name']]['inv_name'] =  $value['inven_template_name'];
        $processeddata[$value['inven_group']]['inv_subgroups'][$value['inven_subgroup']]['inv_templates'][$value['inven_template_name']]['inv_id'] =  $value['inven_template_id'];

    }
    return $processeddata;


EDIT : A var_export

array (
  'inv_templates' => 
  array (
    0 => 
    array (
      'inven_subgroup_template_id' => '1',
      'inven_group' => 'Wires',
      'inven_subgroup' => 'CopperWires',
      'inven_template_id' => '1',
      'inven_template_name' => 'CopperWires6G',
      'constrained' => '0',
      'value_constraints' => '',
      'accept_range' => '2 - 16',
      'information' => 'Measured Manual',
    ),
    1 => 
    array (
      'inven_subgroup_template_id' => '1',
      'inven_group' => 'Wires',
      'inven_subgroup' => 'CopperWires',
      'inven_template_id' => '2',
      'inven_template_name' => 'CopperWires6G',
      'constrained' => '0',
      'value_constraints' => '',
      'accept_range' => '1 - 7',
      'information' => 'Measured by Automated Calipers',
    ),
  ),
)

The foreach is almost unreadable. There must be a simpler way

Upvotes: 2

Views: 145

Answers (3)

goat
goat

Reputation: 31834

I find this format usually works for me. You could do it more efficient, I've just never cared :D

I started traversing at $yourArray['inv_templates'] though.

function groupToStructure(array $rows, array $keys) {
    $tree = array();
    $keys = array_reverse($keys);
    foreach ($rows as $row) {
        $subTree = array($row);
        foreach ($keys as $key) {
            $subTree = array($row[$key] => $subTree);
        }
        $tree = array_merge_recursive($tree, $subTree);
    }
    return $tree;
}

print_r(groupToStructure($rows, array('inven_group', 'inven_subgroup', 'inven_template_name')));

Upvotes: 0

Svemir Brkic
Svemir Brkic

Reputation: 520

$processeddata = array();

foreach($data['inv_templates'] as $key => $value) { 
    $group = $value['inven_group'];
    $processeddata[$group]['inv_group_name'] = $group;

    $subgroup = &$processeddata[$group]['inv_subgroups'][$value['inven_subgroup']];
    $subgroup['inv_subgroup_id'] = $value['inven_subgroup_template_id'];
    $subgroup['inv_subgroup_name'] = $value['inven_subgroup'];

    $template = $value['inven_template_name'];
    $subgroup['inv_templates'][$template]['inv_name'] = $template;
    $subgroup['inv_templates'][$template]['inv_id'] = $value['inven_template_id'];
}

return $processeddata;

Upvotes: 1

Thai
Thai

Reputation: 11364

Untested code. This structures the array in a multidimensional way, and then uses array_merge_recursive to merge them with the already processed data.

if (!isset($processeddata[$value['inven_group']]))
    $processeddata[$value['inven_group']] = array();

$processeddata[$value['inven_group']] = array_merge_recursive(
    $processeddata[$value['inven_group']],
    array(
        'inv_group_name' => $value['inven_group'],
        'inv_subgroups' => array(
            $value['inven_subgroup'] => array(
                'inv_subgroup_id' => $value['inven_subgroup_template_id'],
                'inv_subgroup_name' => $value['inven_subgroup'],
                'inv_templates' => array(
                    $value['inven_template_name'] => array(
                        'inv_name' => $value['inven_template_name'],
                        'inv_id' => $value['inven_template_id'],
                    ),
                ),
            ),
        ),
    )
);

Upvotes: 0

Related Questions