php - 在不使用 PHP 中的 foreach 的情况下从源数组创建一个新的、重新索引的数组

标签 php arrays

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

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

如果可能,我想使用 PHP array 函数之一。我尝试了以下方法,但没有创建品牌名称索引:

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

最佳答案

一种方法是像这样使用 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);

关于php - 在不使用 PHP 中的 foreach 的情况下从源数组创建一个新的、重新索引的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50722263/

相关文章:

c++ - 二维数组的CUDA动态共享内存分配

java - 你能将数组放入Java中的业务方法中吗

php - Laravel 和 LocalStack 的最大执行时间

javascript - turnjs4 翻页禁用我的脚本

php - 带有url参数的Laravel post路由

php - 如何删除JSON中的对象?

php - 从 Facebook 获取事件

Java 数组移动元素

c++ - 编码动态数组C++时出现内存异常

javascript - forEach 循环在 li 标签内的 div 中插入名称