user254153
user254153

Reputation: 1883

Loop through multi-dimensional array and remove duplicate and merge other values

I have array like below. I want to unset all array having same q_id but merge its name key.

      array
         0 => 
           array
              'field_name' => string 'Hindu rastrya' (length=13)
              'name' => string '283' (length=3)
              'q_id' => string '199' (length=3)
         1 => 
           array
              'field_name' => string 'dharma nirpachya' (length=16)
              'name' => string '284' (length=3)
              'q_id' => string '199' (length=3)
         2 => 
           array
              'field_name' => string 'j vaye pni hunxa' (length=16)
              'name' => string '285' (length=3)
              'q_id' => string '199' (length=3)
         3 => 
           array
              'field_name' => string 'Nepal' (length=5)
              'name' => string '286' (length=3)
              'q_id' => string '200' (length=3)
         4 => 
           array
              'field_name' => string 'India' (length=5)
              'name' => string '287' (length=3)
              'q_id' => string '200' (length=3)
         5 => 
           array
              'field_name' => string 'China' (length=5)
              'name' => string '288' (length=3)
              'q_id' => string '200' (length=3)

Expected:

       array
     0 => 
       array
          'field_name' => string 'Hindu rastrya' (length=13)
          'name' => 
                 array
                     0 => string '283' (length=3)
                     1 => string '284' (length=3)
                     2 => string '285' (length=3)
          'q_id' => string '199' (length=3)
     1 => 
       array
          'field_name' => string 'Nepal' (length=16)
          'name' => 
                 array
                     0 => string '286' (length=3)
                     1 => string '287' (length=3)
                     2 => string '288' (length=3)
          'q_id' => string '200' (length=3)

I tried following code but It didnot preserve the keys so it fails:

foreach ($form_option_data as $key=>$option)
    {
        if($form_option_data[$key]['q_id'] == $form_option_data[$key+1]['q_id']){
            unset($form_option_data[$key+1]);
        }
    }

Upvotes: 0

Views: 44

Answers (1)

jedrzej.kurylo
jedrzej.kurylo

Reputation: 40919

The following should do the job:

$data = ...; //initial array
$result = array();

foreach ($data as $entry) {
  if (!array_key_exists($entry['q_id'], $result)) {
    $result[$entry['q_id']] = array(
      'q_id' => $entry['q_id'],
      'name' => array($entry['name'])
    );
  } else {
    $result[$entry['q_id']]['name'][] = $entry['name'];
  }
}

$result = array_values($result); // to re-index the table so that keys start from 0

Upvotes: 2

Related Questions