PHP: 涉及分解键的映射数组

PHP: map array with explode keys involved

在尝试使用多个 foreach 循环解决此问题后,我仍然无法弄清楚如何将 $arr 映射到 $arr_mapped

我需要分解 $arr 的键来获得一个元素最多三个新键来创建 $arr_mapped


<?php

$arr = [
  'abc:quantity' => 1,
  'abc:variant' => 'blue',
  'xyz:quantity' => 2,
  'foo:quantity' => null
];

$arr_mapped = [
  [
    'id' => 'abc',
    'quantity' => 1,
    'variant' => 'blue'
  ],
  [
    'id' => 'xyz',
    'quantity' => 2,
  ]
];

背景:我想让用户在 <form> 中批量添加预定义的购物项目 这是一家定制 PHP 商店。


<form>

<input name="abc:quantity" value="1">
<input name="abc:variant" value="blue">
<input name="xyz:quantity" value="2">
<input name="foo:quantity" value="">

<button>Submit</button>
</form>

感谢任何建议

我认为这将根据您在示例中提供的输入产生您想要的输出(这似乎与示例中的输出不匹配):

$arr = [
  'abc:quantity' => 1,
  'abc:variant' => 'blue',
  'xyz:quantity' => 2,
  'foo:quantity' => null
];

$arr_mapped = array_values(array_reduce(array_keys($arr), function($map, $key) use ($arr) {
    [$id,$field] = explode(':', $key);
    $map[$id]['id'] = $id;
    $map[$id][$field] = $arr[$key];
    return $map;
}, []));

结果:

[
  [
    'id' => 'abc',
    'quantity' => 1,
    'variant' => 'blue'
  ],
  [
    'id' => 'xyz',
    'quantity' => 1,
  ],
  [
    'id' => 'foo',
    'quantity' => null,
  ]
];