Как применить значения подмассива по умолчанию к ассоциативному многомерному массиву? - PullRequest
0 голосов
/ 03 ноября 2019

Мне нужна помощь для объединения нескольких массивов. Например, у меня есть 2 разных массива.

$array1 содержит идентификатор и сумму. $array2 будет иметь дату и сумму на основе идентификатора.

$array1 = [
  310 => 0,
  311 => 0,
  312 => 0,
  313 => 0,
  314 => 0,
  315 => 0
];

$array2 = [
  "2019-05-17" => [
    312 => 3000.00
  ],
  "2019-06-20" => [
    312 => 3000.00
  ],
  "2019-06-27" => [
    313 => 5000.00,
    315 => 3000.00
  ]
];

Конечный результат, который я хочу:

$merge = [
    "2019-05-17" => [
      310 => 0,
      311 => 0,
      312 => 3000.00,
      313 => 0,
      314 => 0,
      315 => 0
    ],
    "2019-06-20" => [         
      310 => 0,
      311 => 0,
      312 => 3000.00,
      313 => 0,
      314 => 0,
      315 => 0
    ],
    "2019-06-27" => [
      310 => 0,       
      311 => 0,
      312 => 0,
      313 => 5000.00,
      314 => 0,
      315 => 3000.0
    ],
];

Могу ли я знать, как этого добиться, чтобы я получил как $merge?

Ответы [ 3 ]

1 голос
/ 03 ноября 2019

4 строки решения. Посмотрите на комментарии в коде.

$final = []; //Creates an empty array.
foreach ($array2 as $key => $value) {
    $final[$key] = $array1; #adds array1 to each key of array2 on new array.
}
$merge = array_replace_recursive($final, $array2); #merges new array with array2.

var_dump($merge); #returns the solution on your question.
1 голос
/ 03 ноября 2019

Не повторять дважды. Объединяйте, когда вы выполняете итерацию за один проход во втором массиве.

Объединение двух массивов с помощью «оператора объединения» (+) приведет к неупорядоченным ключам (не то, что обычно является проблемой с ассоциативными массивами). ). Чтобы использовать массив по умолчанию в качестве «руководства» для ключей подмассивов, вызовите array_replace() в качестве функции слияния.

Код: ( Demo )

foreach ($array2 as &$row) {
    $row += $array1;
    ksort($row);  // if you care
}

Или ( Демо )

foreach ($array2 as &$row) {
    $row = array_replace($array1, $row);
}

Вывод:

array (
  '2019-05-17' => 
  array (
    310 => 0,
    311 => 0,
    312 => 3000.0,
    313 => 0,
    314 => 0,
    315 => 0,
  ),
  '2019-06-20' => 
  array (
    310 => 0,
    311 => 0,
    312 => 3000.0,
    313 => 0,
    314 => 0,
    315 => 0,
  ),
  '2019-06-27' => 
  array (
    310 => 0,
    311 => 0,
    312 => 0,
    313 => 5000.0,
    314 => 0,
    315 => 3000.0,
  ),
)

А если у вас php7.4 или выше, вы можете использовать array_map() с синтаксисом стрелки как однострочный.

Код: ( Demo )

var_export(array_map(fn($row) => array_replace($array1, $row),$array2));

Ниже php7.4 синтаксис array_map() значительно более многословен, Демо .

var_export(
    array_map(
        function($row) use ($array1) {
            return array_replace($array1, $row);
        },
        $array2
    )
);

Просто для удовольствия, вот дополнительная техника с вложенным циклом (языковые конструкции вместо вызовов функций) и объединением нулей (своего рода встроенное условное выражение).

Код: ( Демо )

$merged = [];
foreach($array2 as $date => $row) {
    foreach ($array1 as $id => $value) {
        $merged[$date][$id] = $row[$id] ?? $value;
    }
}
var_export($merged);
1 голос
/ 03 ноября 2019

Вы можете использовать свой первый массив как шаблон.

$newArray = [];
foreach($array2 as $date => $data) {
    $tmpArr = $array1;
    foreach ($data as $id=>$value) {
        if (!array_key_exists($id, $tmpArr)) {
            continue;
        }
        $tmpArr[$id] = $value;
    }
    $newArray[$date] = $tmpArr;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...