我在JSON中有一个响应,它被转换为php中的关联array (Wordpress)。
我想把它保存在不同的table中,这个结构大约有9个层次,每个级别上都有不同的key,尝试用foreach来实现,但是它会导致大约5个嵌套循环得到最深的值。
它是一个相关的结构,因此每个嵌套数组在保存到DB中时都需要从其父数组中提取foreign key。
这是一段摘录。
array(
'data' => array(
0 => array(
'p_a' => array(
1 => array(
'child' => array(
254 => array(
'b_c' => array(
'm' => array(
'c' => array(
'USD' => array(
'price' => '0.99',
),
),
),
),
),
),
),
),
),
),
);所以每个级别都有多个key,但是我只包含了嵌套的,每个命名的键都可以有多个array和'p_a',也可以有多个包含'child' array的arrays,我不知道像data这样的索引可以从1或0开始,但是不知道它将包含多少个子级。其他嵌套的也是类似的。
我尝试将它们保存在其他array中以简化它,但它仍然使其复杂化,我考虑了recursion,但我认为它会为每个级别创建许多if,因为它们在每个级别上并不相同。
有什么好的data-structure可以将它转换成?我认为树,但每个node是不同的,我不知道任何好的树结构,可以帮助这一点?
编辑,我正在做批量insert,所以我想首先保存父母,然后是孩子,但是如果DFS是唯一的方法,那么也许我会一个接一个地做。
编辑如何从上面的数据中插入行
data
id | attributes ...p_a
id | data_id | attributes ...child
id | p_a_id | attributes ...b_c
id | child_id | attributes ...发布于 2020-06-22 13:58:28
递归函数如何保存:
function save_recursive(array $array, int $parentId = null)
{
foreach ($array as $key => $value) {
echo "Save '$key' key with parent id (if it is not null) and with needed attributes and get the last insert id (it will be parent id for the next item)\n";
// $parentId = {last_insert_id};
if (is_array($value)) {
save_recursive($value, $parentId);
}
}
}
save_recursive($array);但在这种情况下,您将无法像一个INSERT语句(大容量)一样,一个接一个地保存它。
替代方案:要执行大容量插入,可以尝试使用以下方案:
AUTO_INCREMENT值,并尝试在递归函数中手动增加它,以构建一个插入查询AUTO_INCREMENT设置为实表。在一个查询中将所有项插入没有parentId的临时表中,而在另一个查询中只将数据从临时表插入到实际表中,并添加其他子查询以填充parentId列(因为您知道所有ids)。但在此之前,必须对其他案件进行检查。也许它们不如一个接一个的插入更有效。
https://stackoverflow.com/questions/62511226
复制相似问题