Search code examples
phparraysmultidimensional-arrayarray-merge

How can I group arrays in a one big array in PHP


I have data here:

Array
(
    [3] => Array
    (
        [SiteID] => 3
        [Balance] => 94000.99
        [MinBalance] => 100000.00
        [MaxBalance] => 500000.00
        [OwnerAID] => 17
        [GroupID] => 1
        [Deposit] => 459000
        [Redemption] => 703576
        [Reload] => 169100
    )

    [2] => Array
    (
        [SiteID] => 2
        [Balance] => 19000.00
        [MinBalance] => 100000.00
        [MaxBalance] => 1000000.00
        [OwnerAID] => 83
        [GroupID] => 1
        [Deposit] => 1500
        [Redemption] => 1000
        [Reload] => 1000
    )

    [139] => Array
    (
        [SiteID] => 139
        [Balance] => 855100.00
        [MinBalance] => 100000.00
        [MaxBalance] => 1000000.00
        [OwnerAID] => 23
        [GroupID] => 1
        [Deposit] => 0  
        [Redemption] => 0 
        [Reload] => 0 
    )
)

I need to group this arrays in to two groups: First group - all OwnerAID owning one SiteID and the Second group all OwnerAID owning more than one SiteID. Is it possible to make it? The result should be shown like this:

here's the group of OwnerAID owning one SiteID in a one big array:

Array
(
    [17] => Array
    (
        [Sites] => Array 
        (
            [0] => Array
            (
                [SiteID] => 3 
                [Balance] => 94000.99  
                [MinBalance] => 100000.00   
                [MaxBalance] => 500000.00  
                [OwnerAID] => 17  
                [GroupID] => 1 
                [Deposit] => 459000  
                [Redemption] => 703576 
                [Reload] => 169100 
            )
        )
    )    
}

while here, OwnerAID owning more than one SiteID in another one big array:

Array
 (
    [83] => Array
    (
        [Sites] => Array 
        (
        [0] => Array
        (
            [SiteID] => 2
            [Balance] => 19000.00
            [MinBalance] => 100000.00
            [MaxBalance] => 1000000.00
            [OwnerAID] => 83
            [GroupID] => 1
            [Deposit] => 1500
            [Redemption] => 1000
            [Reload] => 1000
        ) 
        [1] => Array
        (
            [SiteID] => 149
            [Balance] => 150000.00
            [MinBalance] => 100000.00
            [MaxBalance] => 250000.00
            [OwnerAID] => 83
            [GroupID] => 1
            [Deposit] => 0
            [Redemption] => 0
            [Reload] => 0
        )
    )
)

Someone suggest me this code but I already modified it, I do some research to modify this code. Please help me to accomplish this kind of result. Please be patient in answering my question, I'm just a beginner in a world of programming in PHP.here's the code:

public function groupIndividualAndAggregateSites() 
{
    $owners = array();
    foreach($this->combined as $key => $value) {
        $owner_id = $value['OwnerAID'];
        $site_id = $value['SiteID'];
        if (array_key_exists($owner_id,$owners)) {
            // He has one or more sites already?
            if(is_array($owners[$owner_id])) {
                array_push($owners[$owner_id],$site_id);
            } else {
                // User already has one site.  
                // Make an array instead and add old and new siteID
                $old_site_id = $owners[$site_id];
                $owners[$owner_id] = array_merge((array)$value, array($old_site_id));
            }
        } else {
            $owners[$owner_id] = array($value,'Sites'=> array($site_id));
        }
    }
    print_r($owners); 
}

Please help me, and Thank you in advance. I hope someone could help me to come up with this kind of result. Please guide me in proper way.


Solution

  • This returns exactly what you want.

        <?php
    
    //Array declaration
        $arr = Array
        (
            3 => Array
            (
                "SiteID" => 3,
                "Balance" => 94000,
                "MinBalance" => 100000.00,
                "MaxBalance" => 500000.00,
                "OwnerAID" => 17,
                "GroupID" => 1,
                "Deposit" => 459000,
                "Redemption" => 703576,
                "Reload" => 169100,
            ),
    
            2 => Array
            (
                "SiteID" => 2,
                "Balance" => 19000.00,
                "MinBalance" => 100000.00,
                "MaxBalance" => 1000000.00,
                "OwnerAID" => 83,
                "GroupID" => 1,
                "Deposit" => 1500,
                "Redemption" => 1000,
                "Reload" => 1000,
            ),
    
            139 => Array
            (
                "SiteID" => 139,
                "Balance" => 855100.00,
                "MinBalance" => 100000.00,
                "MaxBalance" => 1000000.00,
                "OwnerAID" => 83,
                "GroupID" => 1,
                "Deposit" => 0,
                "Redemption" => 0 ,
                "Reload" => 0 
            ),
          );
    
    
    //End of declaration;
    //Too lazy for other comments, sorry xD
    
    
        foreach ($arr as $key => $value) {
            $Newarr[$value["OwnerAID"]][] = $value; 
        }
        foreach ($Newarr as $key => $value) {
            foreach ($value as $key2 => $value2) {          
            if (count($value) == 1)
                $arrOneSite[$value2["OwnerAID"]]["Sites"][] = $value2;
                else    
                    $arrMoreThenOneSite[$value2["OwnerAID"]]["Sites"][] = $value2;
            }
        }
    
        echo "<pre>";
        print_r($arrOneSite);
        print_r($arrMoreThenOneSite);
        ?>