У меня есть массив, который выглядит так:

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

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

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

Я хотел бы преобразовать это во что-то примерно со следующей структурой:

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

Я написал следующее, но это не работает:

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

    return $return;

Я пробовал много разных комбинаций, чтобы попытаться заставить это работать. Мой исходный массив может содержать несколько наборов ключей, которые нужно преобразовать в массивы (т.е. это не всегда будет просто «myMusicChoice», который нужно преобразовать в массив)?

Я ничего не добился в этом и был бы признателен за небольшую помощь. Большое спасибо.

0
John T 31 Июл 2014 в 22:05

3 ответа

Лучший ответ

Вам просто нужно перебрать данные и создать новый массив с именем / значением. Если вы видите повторяющееся имя, измените значение на массив.

Что-то вроде этого:

$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'];
    }
}

ДЕМО: https://eval.in/173852

3
Rocket Hazmat 31 Июл 2014 в 18:25
$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++;   
}
1
Thomas Powers 31 Июл 2014 в 18:54

Вот чистое решение, в котором используется 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;
}, []);
1
Ronni Egeriis Persson 31 Июл 2014 в 18:34