首页 > 解决方案 > 根据共同值制作数组

问题描述

我有一个具有以下结构的数组。它有一些重复的值,我需要根据正确的制造商和型号对其进行排序。

2 => array:3 [
    "id_111" => "ALFA ROMEO"
    "id_112" => "4C"
    "id_8702" => "P"
]
3 => array:3 [
    "id_111" => "ALFA ROMEO"
    "id_112" => "GIULIA"
    "id_8702" => "D"
]
4 => array:3 [
    "id_111" => "ALFA ROMEO"
    "id_112" => "GIULIA"
    "id_8702" => "U"
]
5 => array:3 [
    "id_111" => "ALFA ROMEO"
    "id_112" => "GIULIETTA"
    "id_8702" => "D"
]
6 => array:3 [
    "id_111" => "ALFA ROMEO"
    "id_112" => "GIULIETTA"
    "id_8702" => "U"
]
7 => array:3 [
    "id_111" => "ALFA ROMEO"
    "id_112" => "STELVIO"
    "id_8702" => "D"
]

从这个查询中,我必须使结构化数组如下所示:

manufacturers: [
0: {
    name: "ALFA ROMEO", 
    models: [
        0: {
            name: "4C",
            ids: [
                0: { name: "p" }
            ]
        },
        1: {
            name: "GIULIA",
            ids: [
                0: {name: "D"},
                1: {name: "U"}

            ]
        },
        2: {
            name: "GIULIETTA",
            ids: [
                0: {name: "U"},
                1: {name: "D"}
            ]
        }

    ]
}
1: {}

]

到目前为止,我已经尝试过以下代码。但出于某种原因,我有点迷路了。

    $data = array();

    foreach ($records as $record) {
        $id1 = $record["id_111"];
        $data["manufacturer"] = array();
        if (!in_array("id1", $data["manufacturer"])) {
            $data["manufacturer"] = array(
                "name" => $id1
            );
        }
        $id2 = $record["id_112"];

        $data["manufacturer"][] = array("name" => $id2);
    }

任何人都可以帮助我。谢谢你。

标签: phparrays

解决方案


定义一个 groupBy 函数:

function groupBy($items, $key)
{
    $array = array();
    foreach($items as $item) {
       foreach($item as $k => $v) {
           if($key == $k) $array[$v] []= $item;
       }
    }
    return $array;
}

进而

$names = groupBy($records, 'id_111');
$name_array = [];
foreach($names as $name => $name_items) {
    $models = groupBy($name_items, 'id_112');
    $model_array = [];
    foreach($models as $model => $model_items) {
       $ids = array_map(function($item) {
          return ['name' => $item['id_8702']];
       },$model_items);
       $model_array []= ['name' => $model, 'ids' => $ids];
    }
    $name_array []= ['name' => $name, 'models' => $model_array];
}

$results = ['manufacturers' => $name_array];

推荐阅读