John T
John T

Reputation: 1078

How do I reform this array into a differently structured array

I have an array that looks like this:

    [0] => Array
        (
            [name] => typeOfMusic
            [value] => this_music_choice
        )

    [1] => Array
        (
            [name] => myMusicChoice
            [value] => 9
        )

    [2] => Array
        (
            [name] => myMusicChoice
            [value] => 8
        )

I would like to reform this into something with roughly the following structure:

Array(
"typeOfMusic" => "this_music_choice",
"myMusicChoice" => array(9, 8)
)

I have written the following but it doesn't work:

    foreach($originalArray as $key => $value) {
        if( !empty($return[$value["name"]]) ){
            $return[$value["name"]][] = $value["value"];
        } else {
            $return[$value["name"]] = $value["value"];
        }
    }

    return $return;

I've tried lots of different combinations to try and get this working. My original array could contain several sets of keys that need converting to arrays (i.e. it's not always going to be just "myMusicChoice" that needs converting to an array) ?

I'm getting nowhere with this and would appreciate a little help. Many thanks.

Upvotes: 0

Views: 150

Answers (3)

Thomas Powers
Thomas Powers

Reputation: 129

$arr = array(
    0 => array(
        'name'  => 'typeOfMusic',
        'value' => 'this_music_choice'
    ),
    1 => array(
        'name'  => 'myMusicChoice',
        'value' => 9
    ),
    2 => array(
        'name'  => 'myMusicChoice',
        'value' => 8
    )
);

$newArr = array();
$name = 'name';
$value = 'value';
$x = 0;
foreach($arr as $row) {
    if ($x == 0) {
        $newArr[$row[$$name]] = $row[$$value];
    } else {
        if (! is_array($newArr[$row[$$name]])) {
            $newArr[$row[$$name]] = array();
        }
        array_push($newArr[$row[$$name]], $row[$$value]);
    }       

    $x++;   
}

Upvotes: 1

Ronni Egeriis Persson
Ronni Egeriis Persson

Reputation: 2289

Here's a clean solution, which uses array_reduce

$a = [
    [
        'name' => 'typeOfMusic',
        'value' => 'this_music_choice'
    ],
    [
        'name' => 'myMusicChoice',
        'value' => 9
    ],
    [
        'name' => 'myMusicChoice',
        'value' => 8
    ]
];

$r = array_reduce($a, function(&$array, $item){
    // Has this key been initialized yet?
    if (empty($array[$item['name']])) {
        $array[$item['name']] = [];
    }
    $array[$item['name']][] = $item['value'];
    return $array;
}, []);

Upvotes: 1

gen_Eric
gen_Eric

Reputation: 227200

You just need to loop over the data and create a new array with the name/value. If you see a repeat name, then change the value into an array.

Something like this:

$return = array();
foreach($originalArray as $data){
    if(!isset($return[$data['name']])){
        // This is the first time we've seen this name,
        // it's not in $return, so let's add it
        $return[$data['name']] = $data['value'];
    }
    elseif(!is_array($return[$data['name']])){
        // We've seen this key before, but it's not already an array
        // let's convert it to an array
        $return[$data['name']] = array($return[$data['name']], $data['value']);
    }
    else{
        // We've seen this key before, so let's just add to the array
        $return[$data['name']][] = $data['value'];
    }
}

DEMO: https://eval.in/173852

Upvotes: 3

Related Questions