Manish M Demblani
Manish M Demblani

Reputation: 910

How to convert Array using CakePHP HASH class?

I am working on CakePHP. Recently I started using the CakePHP Hash Class. I want to convert an array format using the Hash Class functions. I have the following array :

$arr = array(
    0 => array(
        'key1' => array(
            'id' => 6
            'type' => insert
            'field_id' => 2
            'activity' => table
            ),
            'key2' => array(
            0 => array(
                'id' =>     
                'key1_id' => 6
            )
            1 => array(
                'id' =>     
                'key1_id' => 6
                )
            )
    )
    1 => array(
            'key1' => array(
            'id' => 5
            'type' => edit
            'field_id' => 3
            'activity' => list
            ),
            'key2' => array(
            0 => array(
                'id' =>     
                'key1_id' => 5
                )
            1 => array(
                'id' =>     
                'key1_id' => 5
            )
          )
    )
    2 => array(
            'key1' => array(
            'id' => 4
            'type' => insert
            'field_id' => 2 
            'activity' => table
            ),
            'key2' => array(
            0 => array(
                'id' =>     
                'key1_id' => 4
                )
            )
    )
    3 => array(
        'key1' => array(
            'id' => 3
            'type' => insert
            'field_id' => 3
            'activity' => list
            ),
            'key2' => array(
            0 => array(
                'id' =>     
                'key1_id' => 3
                )   
        )
    )
    4 => array(
            'key1' => array(
            'id' => 2
            'type' => edit 
            'field_id' => 1
            'activity' => list
        ),
            'key2' => array(
            0 => array(
                'id' =>     
                'key1_id' => 2
                )   
        )
    )
    5 => array(
            'key1' => array(
            'id' => 1
            'type' => edit
            'field_id' => 3
            'activity' => list
            ),
            'key2' => array(
            0 => array(
                'id' =>     
                'key1_id' => 1
                )   
        )
    )

);

The condition is that any key1 having type, field_id and activity exactly will result in all the key2 being merged together and the key1 that occurs later in the list gets unset. I want to convert it into the following format :

$arr = array(
    0 => array(
        'key1' => array(
            'id' => 6
            'type' => insert
            'field_id' => 2
            'activity' => table
            ),
            'key2' => array(
            0 => array(
                'id' =>     
                'key1_id' => 6
            )
            1 => array(
                'id' =>     
                'key1_id' => 6
                )
            2 => array(
                'id' =>     
                'key1_id' => 4
                )

            )
    )
    1 => array(
            'key1' => array(
            'id' => 5
            'type' => edit
            'field_id' => 3
            'activity' => list
            ),
            'key2' => array(
            0 => array(
                'id' =>     
                'key1_id' => 5
                )
            1 => array(
                'id' =>     
                'key1_id' => 5
            )
            2 => array(
                'id' =>     
                'key1_id' => 1
            )   
          )
    )

    3 => array(
        'key1' => array(
            'id' => 3
            'type' => insert
            'field_id' => 3
            'activity' => list
            ),
            'key2' => array(
            0 => array(
                'id' =>     
                'key1_id' => 3
                )   
        )
    )
    4 => array(
            'key1' => array(
            'id' => 2
            'type' => edit 
            'field_id' => 1
            'activity' => list
        ),
            'key2' => array(
            0 => array(
                'id' =>     
                'key1_id' => 2
                )   
        )
    )
);

If you have a look key2 value for key '2' is merged with key '0' and '2' is unset. The missing key values should basically be unset. I want to know the best possible way in which I can attain this format for the array.

Upvotes: 0

Views: 306

Answers (1)

Hardik Sondagar
Hardik Sondagar

Reputation: 4495

What you are trying to do it's bit tricky. I recommend to achieve this by trying with some different CakePHP sql query.

Solution

$keys = Hash::extract($arr, '{n}.key1.field_id');
$vals = Hash::extract($arr, '{n}');
$result = $this->array_combine_($keys, $vals);


function array_merge_multiple(&$v) {
 $z1 = array();
 $z2 = array();
 $len = count($v);
 for ($i = 0; $i < $len; $i++) {
     if ($i < ($len - 1)) {
         $z1 = array_merge($v[$i]['key2'], $v[$i + 1]['key2']);
         $z2 = array_merge($v[$i]['key1'], $v[$i + 1]['key1']);
     } else if($len==1){
         $z1 = $v[$i]['key2'];
         $z2 = $v[$i]['key1'];
     }
     unset($v[$i]);
 }
 $v['key1'] = $z1;
 $v['key2'] = $z2;
}

/* Modified array_combine function ( Hash::combine uses array_combine internally */
function array_combine_($keys, $values) {
    $result = array();
    foreach ($keys as $i => $k) {
        $result[$k][] = $values[$i];
    }
    array_walk($result, 'array_merge_multiple');
    return $result;
}

Upvotes: 0

Related Questions