代码之家  ›  专栏  ›  技术社区  ›  OK sure

在php中不使用foreach从源数组创建新的、重新索引的数组

  •  3
  • OK sure  · 技术社区  · 7 年前

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

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

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


    第2部分:同时为品牌打造独特车型的加分。

    $data = [
        'Brand A' => [
            'Model A',
            'Model B',
            'Model C',
        ],
        'Brand B' => [
            'Model A',
            'Model B',
            'Model C',
        ],
    ];
    
    2 回复  |  直到 7 年前
        1
  •  9
  •   Stephan van Leeuwen    7 年前

    一种方法是像这样使用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);
    
        2
  •  0
  •   delboy1978uk    7 年前

    我真的认为这是过度的工程设计。

    不过,我要在这里加分!

    $new = [];
    foreach ($rows as $row) {
        $new[$row[0]][] = $row[1];
        $new[$row[0]] = array_unique($new[$row[0]]);
    }