解析嵌套数组并将其保存在具有父ID的mysql数据库中

时间:2018-06-21 09:14:56

标签: php multidimensional-array laravel-5.6

我有一个类似于以下的嵌套数组:-

array(
    array(
        'id' => 45cfeteuid536hjj929,
        'name' = 'Cuisines',
        'children' => array(
            array(
                'id' => 45gcfeteuid536hjj929,
                'name' = 'Itlaian',  
            ),
            array(
                'id' => 45bjfe78ng5d536hjj92,
                'name' = 'Indian',
                'children' => array(
                    array(
                        'id' => 457hfe78ng5d53ghy56j,
                        'name' = 'Punjabi'
                    )
                )
            )
        )
    )
);

我有一个这样的表:-

|--------------------------------|
|   id  |   name   |  parent_id  |
|--------------------------------|

我希望这样插入数据:-

|---------------------------------------------------------------|
|   id  |   name     |  parent_id  |    api_id                  |
|---------------------------------------------------------------|
|    1  |   Cuisines |      0      |    45cfeteuid536hjj929     |
|---------------------------------------------------------------|
|    2  |   Italian  |      1      |    45gcfeteuid536hjj929    |
|---------------------------------------------------------------|
|    3  |    Indian  |      1      |    45bjfe78ng5d536hjj92    |
|---------------------------------------------------------------|
|    4  |   Punjabi  |      3      |    457hfe78ng5d53ghy56j    |
|---------------------------------------------------------------|

子项的parent_id是其所属对象的ID。表的ID是mysql db自动生成的autoincrement值。

例如:-

  • 第1步:在保存美食的同时,保存了id(自然是自动递增) 是1。因为它是根,所以parent_id =0。
  • 第2步:在保存意大利语的同时,id(自然会自动递增) 保存为1。由于它是一位美食孩子,因此parent_id = 1

如何以这种方式保存嵌套数组?

1 个答案:

答案 0 :(得分:0)

一种方法是生成看起来像这样的insert语句(假设您的表称为tab):

insert into tab(name, parent_id, app_id) 
    select 'Cuisines', coalesce(min(id), 0), '45cfeteuid536hjj929' from tab
    where app_id = '';
insert into tab(name, parent_id, app_id)
    select 'Itlaian', coalesce(min(id), 0), '45gcfeteuid536hjj929' from tab
    where app_id = '45cfeteuid536hjj929';
insert into tab(name, parent_id, app_id)
    select 'Indian', coalesce(min(id), 0), '45bjfe78ng5d536hjj92' from tab
    where app_id = '45cfeteuid536hjj929';
insert into tab(name, parent_id, app_id)
    select 'Punjabi', coalesce(min(id), 0), '457hfe78ng5d53ghy56j' from tab
    where app_id = '45bjfe78ng5d536hjj92';

这些查询将通过父级应该具有的app_id找到父级ID。没有插入id列的值,因为假定数据库将在插入时生成它。

这是一个递归的PHP函数,它生成这些语句。您必须对其进行调整,以使用您使用的任何API(PDO,mysqli等)实际执行那些语句:

function insertRecords($data, $parent = "") {
    foreach($data as $row) {
        // Replace next echo statement with the code to actually execute this SQL:
        echo "insert into tab(name, parent_id, app_id) select '$row[name]', coalesce(min(id), 0), '$row[id]' from tab where app_id = '$parent';\n";
        if (isset($row["children"])) insertRecords($row["children"], $row["id"]);
    }
}    

假设您的嵌套数据结构存储在变量$data中,请像这样调用上面的函数:

insertRecords($data);