Search code examples
phparrayscakephpnestedflat

convert a 'flat array' into 'nested array' with cakephp(or php)


sorry for my bad english :(

i want to convert a 'flat array' into 'nested array' with cakephp(or php)

from this :

$results = array(
    array('customer' => 'John', 'hotel' => 'Sheraton', 'roomtype' => 'Single'),
    array('customer' => 'John', 'hotel' => 'Sheraton', 'roomtype' => 'Double'),
    array('customer' => 'John', 'hotel' => 'Sheraton', 'roomtype' => 'Triple'),
    array('customer' => 'John', 'hotel' => 'Hilton', 'roomtype' => 'Single'),
    array('customer' => 'Doe', 'hotel' => 'Hilton', 'roomtype' => 'Single'),
    array('customer' => 'Doe', 'hotel' => 'Hilton', 'roomtype' => 'Double'),
    array('customer' => 'Doe', 'hotel' => 'Sheraton', 'roomtype' => 'Single')
);

into this:

$results = array(
    array(
        'customer' => 'Jhon',
        'children' => array(
            array(
                'hotel' => 'Sheraton', 
                'children' => array(
                    array('roomtype' => 'Single'),
                    array('roomtype' => 'Double'),
                    array('roomtype' => 'Triple')
                )
            ),
            array(
                'hotel' => 'Hilton',
                'children' => array(
                    array('roomtype' => 'Single')
                )
            ),
        )
    ),
    array(
        'customer' => 'Doe',
        'children' => array(
            array(
                'hotel' => 'Hilton', 
                'children' => array(
                    array('roomtype' => 'Single'),
                    array('roomtype' => 'Double')
                )
            ),
            array(
                'hotel' => 'Sheraton',
                'children' => array(
                    array('roomtype' => 'Single')
                )
            ),
        )
    )
);

i tried the loops(for, foreach, while)

i tried also the Set::nest() cakephp utility but i don't figure out a solution :(

is there any "magic solution" to resolve this ?

thanks


Solution

  • Try this

        $convert = array();
        $customer_key = array();
        $hotel_key = array();
        $index = 0;
        foreach ($results as $row) {
            if (!isset($customer_key[$row['customer']])) {
                $customer_key[$row['customer']] = $index;
                $index++;
            }
            $key = $customer_key[$row['customer']];
            $convert[$key]['customer'] = $row['customer'];
            if (!isset($hotel_key[$key])) {
                $hotel_key[$key][$row['hotel']] = 0;
            }
            elseif (!isset($hotel_key[$key][$row['hotel']])) {
                $hotel_key[$key][$row['hotel']] = count($hotel_key[$key]);
            }
            $h_key = $hotel_key[$key][$row['hotel']];
            $convert[$key]['children'][$h_key]['hotel'] = $row['hotel'];
            $convert[$key]['children'][$h_key]['children'][]= array('roomtype' => $row['roomtype']);
        }
    
        print_r($convert);
    

    It should convert your given array to accepted array