3

我创建了一个导入脚本,将包含车辆品牌和型号的电子表格转换为相关的数据库实体。我的电子表格中的源数组如下所示(每个都是电子表格行):

$rows = [
    ['Brand A', 'Model A'],
    ['Brand A', 'Model A'],
    ['Brand A', 'Model B'],
    ['Brand A', 'Model B'],
    ['Brand A', 'Model B'],
    ['Brand A', 'Model C'],
    ['Brand B', 'Model A'],
    ['Brand B', 'Model B'],
    ['Brand B', 'Model B'],
    ['Brand B', 'Model B'],
    ['Brand B', 'Model C'],
    ['Brand B', 'Model C'],
];

我想要这种格式的数据:

$data = [
    'Brand A' => [
        'Model A',
        'Model A',
        'Model B',
        'Model B',
        'Model B',
        'Model C',
    ],
    'Brand B' => [
        'Model A',
        'Model B',
        'Model B',
        'Model B',
        'Model C',
        'Model C',
    ],
];

我有一个使用 foreach 循环的工作示例:

$data = [];
foreach ($rows as $row) {
    $data[strval($row[0])][] => strval($row[1]);
}

如果可能的话,我想使用其中一个 PHParray函数。我尝试了以下方法,但它没有创建品牌名称索引:

$data = array_map(function ($row) {
    return $data[strval($row[0])][] = strval($row[1]);
}, $rows);

数组最终如下:

$data = [
    'Model A',
    'Model A',
    ...
];

这是可能的还是我浪费我的时间/过度设计这个?


PT 2:同时为品牌打造独一无二的模型的奖励积分。

$data = [
    'Brand A' => [
        'Model A',
        'Model B',
        'Model C',
    ],
    'Brand B' => [
        'Model A',
        'Model B',
        'Model C',
    ],
];
4

2 回答 2

9

一种方法是像这样使用array_reduce

$data = array_reduce($rows, function ($acc, $row) {
    $acc[$row[0]][] = $row[1];
    return $acc;
}, []);

要使子数组唯一,您可以在之后使用 array_map 和 array_unique 的组合

$data = array_map(function ($subarr) {
    return array_unique($subarr);
}, $data);
于 2018-06-06T14:08:13.390 回答
0

老实说,我认为这是在工程方面的事情。

但是,我要在这里获得奖励积分!

$new = [];
foreach ($rows as $row) {
    $new[$row[0]][] = $row[1];
    $new[$row[0]] = array_unique($new[$row[0]]);
}
于 2018-06-06T14:19:36.270 回答