Как преобразовать массив одноэлементных ассоциативных массивов в сгруппированные подмассивы? - PullRequest
0 голосов
/ 30 мая 2020

У меня есть ассоциативный массив:

Array ( 
[0] => Array ( [term_title] => black ) 
[1] => Array ( [color_quantity] => 2 ) 
[2] => Array ( [color_price] => 22 ) 
[3] => Array ( [term_title] => blue ) 
[4] => Array ( [color_quantity] => 3 ) 
[5] => Array ( [color_price] => 33 ))

Как я могу изменить его на:

Array ( 
[0] => Array ( [term_title] => black, [color_quantity] => 2, [color_price] => 22 ) 
[1] => Array ( [term_title] => blue, [color_quantity] => 3, [color_price] => 33 ) )

Я пробую следующий код:

$post = array();
for($i = 0; $i < 2; $i++){
    foreach($feild_data as $data){
        $post[$i][$data['name']] = $data['value'];
    }
}

но он повторяет последний индекс два раза. т.е.

Array ( 
[0] => Array ( [term_title] => blue, [color_quantity] => 3, [color_price] => 33 ) 
[1] => Array ( [term_title] => blue, [color_quantity] => 3, [color_price] => 33 ) )

Ответы [ 2 ]

1 голос
/ 31 августа 2020

Если вам нравятся языковые конструкции и базовые c арифметические c, тогда вы можете просто l oop через массив, разделить на 3 и использовать это значение с плавающей запятой в качестве ключа первого уровня - php автоматически floor() это значение для формирования целого числа

Код: ( Демо )

foreach ($array as $index => $subarray) {
    $key = key($subarray);
    $result[$index / 3][$key] = $subarray[$key];
}
var_export($result);

В качестве альтернативы, если вы предпочитаете функциональный синтаксис (а я часто это делаю), вы может формировать группы подмассивов, а затем объединять / сглаживать группы. Приведенный ниже метод не требует объявления переменной $result и может быть записан как однострочный.

Код: ( Demo )

var_export(
    array_map(
        function($v) {
            return array_merge(...$v);
        },
        array_chunk($array, 3)
    )
);

Оба метода дают следующий результат:

array (
  0 => 
  array (
    'term_title' => 'black',
    'color_quantity' => 2,
    'color_price' => 22,
  ),
  1 => 
  array (
    'term_title' => 'blue',
    'color_quantity' => 3,
    'color_price' => 33,
  ),
)
1 голос
/ 30 мая 2020

Не уверен, откуда name и value пришли в $data['name'] и $data['value'], но вы можете использовать array_chunk, чтобы разделить их на части и присвоить им $posts.

<?php

$posts = array();
foreach(array_chunk($field_data,3) as $data){
    $temp = [];
    foreach($data as $field){
        foreach($field as $key => $value){
            $temp[$key] = $value;
        }
    }

    $posts[] = $temp;
}


print_r($posts);
...