phparraysmultidimensional-arraygroupingoverwrite

Group rows of a 2d array by two columns and overwrite valueless associative elements in each group


I have a 2d array. How can I group by date values and combine the active and passive values for each date?

[
    ["status" => "ONE",   "active" => "103347.02", "passive" => " ",    "date" => "2016-08-01"],
    ["status" => "TWO",   "active" => "65.32",     "passive" => " ",    "date" => "2016-08-01"],
    ["status" => "THREE", "active" => "3258.39",   "passive" => " ",    "date" => "2016-08-01"],
    ["status" => "FOUR",  "active" => "35470.01",  "passive" => " ",    "date" => "2016-08-01"],
    ["status" => "ONE",   "active" => "152685.68", "passive" => " ",    "date" => "2016-08-02"],
    ["status" => "TWO",   "active" => "1739.33",   "passive" => " ",    "date" => "2016-08-02"],
    ["status" => "THREE", "active" => "1300.00",   "passive" => " ",    "date" => "2016-08-02"],
    ["status" => "FOUR",  "active" => "31461.06",  "passive" => " ",    "date" => "2016-08-02"],
    ["status" => "ONE",   "active" => " ",         "passive" => "2236", "date" => "2016-08-01"],
    ["status" => "THREE", "active" => " ",         "passive" => "4496", "date" => "2016-08-02"]
]

Expected result:

[
    ["status" => "ONE",   "active" => "103347.02", "passive" => "2236", "date" => "2016-08-01"],
    ["status" => "TWO",   "active" => "65.32",     "passive" => " ",    "date" => "2016-08-01"],
    ["status" => "THREE", "active" => "3258.39",   "passive" => " ",    "date" => "2016-08-01"],
    ["status" => "FOUR",  "active" => "35470.01",  "passive" => " ",    "date" => "2016-08-01"],
    ["status" => "ONE",   "active" => "152685.68", "passive" => " ",    "date" => "2016-08-02"],
    ["status" => "TWO",   "active" => "1739.33",   "passive" => " ",    "date" => "2016-08-02"],
    ["status" => "THREE", "active" => "1300.00",   "passive" => "4496", "date" => "2016-08-02"],
    ["status" => "FOUR",  "active" => "31461.06",  "passive" => " ",    "date" => "2016-08-02"]
]

Solution

  • This is another way you can get your output.

      $input=array( 
        0=> array( "status"=> "ONE" ,"active"=>  "103347.02","passive"=>" " ,"date"=> "2016-08-01" ),
        1=> array( "status"=> "TWO" ,"active"=> "65.32" ,"passive"=> " " ,"date"=> "2016-08-01" ),
        2=> array("status"=> "THREE" ,"active"=> "3258.39" ,"passive"=> " " ,"date"=>"2016-08-01" ),
        3=> array( "status"=> "FOUR" ,"active"=> "35470.01" ,"passive"=> " " ,"date"=>"2016-08-01" ),
        4=> array( "status"=> "ONE" ,"active"=> "152685.68" ,"passive"=> " " ,"date"=> "2016-08-02" ),
        5=> array( "status"=> "TWO" ,"active"=> "1739.33" ,"passive"=> " " ,"date"=> "2016-08-02" ),
        6=> array( "status"=> "THREE" ,"active"=> "1300.00" ,"passive"=> " " ,"date"=> "2016-08-02" ),
        7=> array( "status"=> "FOUR" ,"active"=> "31461.06" ,"passive"=>  " " ,"date"=>  "2016-08-02" ),
        8=> array( "status"=> "ONE" ,"active"=>  " " ,"passive"=> "2236" ,"date"=> "2016-08-01"),   
        9=> array( "status"=> "THREE" ,"active"=> " " ,"passive"=> "4496" ,"date"=>  "2016-08-02" )
    );
    
    foreach($input as $index_1 => $value_1){
        if(ctype_space($value_1['active']) && !ctype_space($value_1['passive'])) {
            foreach($input as $index_2 => $value_2){
                if($value_2['status']==$value_1['status'] && ctype_space($value_2['passive'])){
                    $input[$index_2]['passive']=$value_1['passive'];
                    unset($input[$index_1]);
                    break; 
                }
            }
        }
    }
    var_dump($input);