bear
bear

Reputation: 11605

Merging and ordering a PHP Multidimensional array

I want to try to merge and sort a multidimensional array. Currently the array looks like this:

Array
(
[0] => Array
    (
        [customerID] => 1234
        [service]    => Car
        [CSA]        => Jack
        [status]     => 3
    )

[1] => Array
    (
        [customerID] => 1234
        [service]    => Cap
        [CSA]        => Jill
        [status]     => 3
    )

[2] => Array
    (
        [customerID] => 1234456
        [service]    => Plate
        [CSA]        => Jack
        [status]     => 1
    )

)

In this multidimensional array, The customerID will be unique, however, many second-level arrays feature the same customerID. Similarly, in these arrays, the CSA could be the same along with the status.

I want the end array to look as follows:

Array
(
[0] => Array
    (
        [customerID] => 1234
        [service]    => Car <br/> Cap
        [CSA]        => Jack <br /> Jill
        [status]     => 3 
    )

[2] => Array
    (
        [customerID] => 1234456
        [service]    => Plate
        [CSA]        => Jack
        [status]     => 1
    )

)

Now, if the service is the same in a set where the customerID is the index, then it shouldn't be added to the value string. The same goes for everything else but the CustomerID.

How do I do this with PHP?

Upvotes: 0

Views: 97

Answers (2)

Stegrex
Stegrex

Reputation: 4024

Try this if you don't mind an output array that uses the customer ID as array keys:

$finalArray = array(); // This will be the output array.
foreach ($mainArray as $subArray) { // Iterate through the multidimensional array.
    $currentCustomerID = $subArray['customerID'];
    if (!array_key_exists($currentCustomerID, $finalArray)) { // If the customer hasn't been loaded into the output array yet, load the current array in.
        $finalArray[$currentCustomerID] = $subArray;
    }
    else { // If the customer has already been loaded into the output array, concatenate the service and CSA values.
        $finalArray[$currentCustomerID]['service'] .= ' <br /> '.$subArray['service'];
        $finalArray[$currentCustomerID]['CSA'] .= ' <br /> ' . $subArray['CSA'];
        // Not sure how you want to handle the status, but you can do something like:
        // if ($subArray['status'] > $finalArray[$currentCustomerID]['status']) {
        //     $finalArray[$currentCustomerID]['status'] = $subArray['status'];
        // }
        // ...or using whatever other conditions you need to handle it.
    }

}

Upvotes: 0

ZhukV
ZhukV

Reputation: 3178

You can control customerID as array key.

Base example:

$arr = array(/** **/);

$arrayResult = array();

foreach ($arr as $itemResult) {
  if (!isset($arrayResult[$itemResult['customerID']])) {
    $arrayResult[$itemResult['customerID']] = $itemResult;
    continue;
  }

  // Adding service
  $arrayResult[$itemResult['customerID']]['service'] .= '<br />' . $itemResult['service'];
  // Adding CSA
  $arrayResult[$itemResult['customerID']]['CSA'] .= '<br />' . $itemResult['CSA'];
}

Upvotes: 1

Related Questions