Search code examples
phparraysmultidimensional-arraygrouping

Convert 2d array rows to a consolidated associative 2d array by grouping on an identifying column


Here is my multidimensional array. I want to extract specific fields from them and create a consolidated array.

$array = [
    ['in_user_id' => 157, 'st_meta_key' => 'city',      'st_meta_value' => 'jaipur'],
    ['in_user_id' => 157, 'st_meta_key' => 'latitude'],
    ['in_user_id' => 157, 'st_meta_key' => 'longitude'],
    ['in_user_id' => 203, 'st_meta_key' => 'city',      'st_meta_value' => 'Jaipur'],
    ['in_user_id' => 203, 'st_meta_key' => 'latitude',  'st_meta_value' => '26.8517972'],
    ['in_user_id' => 203, 'st_meta_key' => 'longitude', 'st_meta_value' => '75.7862232'],
    ['in_user_id' => 214, 'st_meta_key' => 'city',      'st_meta_value' => 'Jaipur'],
    ['in_user_id' => 214, 'st_meta_key' => 'latitude',  'st_meta_value' => '26.8517972'],
    ['in_user_id' => 214, 'st_meta_key' => 'longitude', 'st_meta_value' => '75.7862232']
];

I want something like this:

Array(
    [id] => 157,
    [city] => jaipur,
    [latitude] => '',
    [longitude] => '',
    [id] => 203,
    [city] => Jaipur,
    [latitude] => '26.8517972',
    [longitude] => '75.7862232',
    [id] => 214,
    [city] => Jaipur,
    [latitude] => '26.8517972',
    [longitude] => '75.7862232',
 )

Solution

  • foreach ($run as $childArray) 
    { 
    
        if($childArray['st_meta_key'] == 'city'){
            $fin[$i] = array(
                    'id' => $childArray['in_user_id'],
                    'city' => $childArray['st_meta_value'],
    
    
                    );
        }
        if($childArray['st_meta_key'] == 'latitude'){
            $fin[$i] = array(
                     'id' => $childArray['in_user_id'],
                    'latitude' => $childArray['st_meta_value'],
    
                    );
        }
        if($childArray['st_meta_key'] == 'longitude'){
            $fin[$i] = array(
                    'id' => $childArray['in_user_id'],
                    'longitude' => $childArray['st_meta_value'],
    
                    );
        }
        if($childArray['st_meta_key'] == 'address'){
            $fin[$i] = array(
                    'id' => $childArray['in_user_id'],
                    'address' => $childArray['st_meta_value'],
    
                    );
        }
        $i++; 
    }
    $arryc = 0;
    foreach($fin as $key => $val){
    
       if(is_array($val)){
    
           foreach($val as $k => $v){
    
            if($k == 'id' && $k == $k)   {
    
                   //$singleDimArray['id'] = $val['id'];
                   if(!empty($val['city'])){
                    $singleDimArray[$arryc]['id'] = $val['id'];
                      $singleDimArray[$arryc]['city'] = $val['city']; 
                   }
                   if(!empty($val['address'])){
                    $singleDimArray[$arryc]['id'] = $val['id'];
                       $singleDimArray[$arryc]['address'] = $val['address'];
                   }
                   if(!empty($val['latitude'])){
                    $singleDimArray[$arryc]['id'] = $val['id'];
                       $singleDimArray[$arryc]['latitude'] = $val['latitude'];
                   }
                   if(!empty($val['longitude'])){
                    $singleDimArray[$arryc]['id'] = $val['id'];
                       $singleDimArray[$arryc]['longitude'] = $val['longitude'];
                   }
    
    
    
                }
    
                $arryc++;
            }
       }
    
    }
    
    $arraysMerged = [];
    $newarray=[];
       foreach($singleDimArray as $x){
    
        $arraysMerged = array_merge($arraysMerged, $x); 
        $newarray[$x['id']][]=$arraysMerged;
         }
        $FinL= array();
        foreach($newarray as $val){
           // print_r($newarray);
             $FinL[]= end($val);
        }
    

    echo json_encode($FinL); }

    }