user13914688
user13914688

Reputation:

Group & reorder array elements in PHP

I have a multidimensional array that I want to be regrouped. The array looks like the following.

$originalArray = array
(
    'APPLE' => array(
            'BASE_PRICE' => 7.5,
            'MARKUP' => 1.2
        ),

    'ORANGE' => array
        (
            'BASE_PRICE' => 0,
            'MARKUP' => 4
        ),

    'BANANA' => array
        (
            'BASE_PRICE' => 0,
            'MARKUP' => 6
        ),

    'LIME' => array
        (
            'BASE_PRICE' => 0,
            'MARKUP' => 8
        )

);

I want it reordered such that it is grouped into BASE_PRICE and MARKUP as the following.

$newArray = array (
    'BASE_PRICE' => array
        (
            'APPLE' => 7.5,
            'ORANGE' => 0,
            'BANANA' => 0,
            'LIME' => 0
        ),

    'MARKUP' => array
        (
            'APPLE' => 1.2,
            'ORANGE' => 6,
            'BANANA' => 4,
            'LIME' => 8
        )
);

How do I use loops to achieve the new array? Any help would be greatly appreciated.

So far I've tried the following but not getting what I expect.

arsort($originalArray);

Upvotes: 3

Views: 60

Answers (3)

Slava Rozhnev
Slava Rozhnev

Reputation: 10163

You can use array-reduce function by next way:

<?php

$originalArray = array
(
    'APPLE' => array(
            'BASE_PRICE' => 7.5,
            'MARKUP' => 1.2
        ),

    'ORANGE' => array
        (
            'BASE_PRICE' => 0,
            'MARKUP' => 4
        ),

    'BANANA' => array
        (
            'BASE_PRICE' => 0,
            'MARKUP' => 6
        ),

    'LIME' => array
        (
            'BASE_PRICE' => 0,
            'MARKUP' => 8
        )

);

$resultArray = array_reduce(
  array_keys($originalArray),
  function($accumulator, $key) use($originalArray) {
    $accumulator['BASE_PRICE'][$key]=$originalArray[$key]['BASE_PRICE'];
    $accumulator['MARKUP'][$key]=$originalArray[$key]['MARKUP'];
    return $accumulator;
  },[]
);
print_r($resultArray);
?>

Upvotes: 0

Kunal Raut
Kunal Raut

Reputation: 2584

You can achieve the desired array by using

 foreach ($originalArray as $key => $value) {
  $array1['BASE_PRICE'][$key] = $value['BASE_PRICE'];
  $array2['MARKUP'][$key] = $value['MARKUP'];
 }
 $newarray = array_merge($array1,$array2);

Output

Array
(
    [BASE_PRICE] => Array
        (
            [APPLE] => 7.5
            [ORANGE] => 0
            [BANANA] => 0
            [LIME] => 0
        )

    [MARKUP] => Array
        (
            [APPLE] => 1.2
            [ORANGE] => 4
            [BANANA] => 6
            [LIME] => 8
        )

)

Upvotes: 1

GNassro
GNassro

Reputation: 1071

you can use asort function :

function sort_array ($inputArray){
    $outputArray = array();
    foreach ($inputArray as $index => $value){
        $outputArray["BASE_PRICE"][$index] = $value["BASE_PRICE"];
        $outputArray["MARKUP"][$index] = $value["MARKUP"];
    }

    foreach ($outputArray as $value){
        asort($value);
        asort($value);
    }
    return $outputArray;
}

var_dump(sort_array($originalArray));

Upvotes: 0

Related Questions