递归遍历并比较多维数组和一维数组,并使用映射的值构建diff



给定这两个数组(一个来自json,解码为PHP数组,而另一个来自DB,因此它是一维的(,我需要以某种方式只比较其中的一些值,以只使用更改的值构建一个新的嵌套数组。

$data_array = [
'example_1' => [
'example_2' => [
"color.1" => "green"
],
'example_3' => [
"color.2" => "orange",
"color.3" => "red",
]
],
'level_one' => [
'level_two' => [
'level_three' => [
'color.4' => "purple",
'color.5' => "brown",
],
]
]
];
$db_array = [
'color_1' => "pink",
'color_2' => "orange",
'color_3' => "yellow",
'color_4' => "purple",
'color_5' => "red"
];

由于我要比较的密钥名称不相同,而且它们也嵌套在数据数组中(例如DB = array_key_1Data array = level_one > level_two > level_three > array.key.1,我正在创建第三个数组来映射密钥。它包含所有指向需要比较的子节点的父节点,最后它是一个数组,用于将密钥从data/json数组映射到db数组。

$compare = [
'example_1' => [
'example_3' => [
[ 'data_key' => 'color.2', 'database_key' => 'color_2'],
[ 'data_key' => 'color.3', 'database_key' => 'color_3']
]
],
'level_one' => [
'level_two' => [
'level_three' => [
[ 'data_key' => 'color.4', 'database_key' => 'color_4'],
[ 'data_key' => 'color.5', 'database_key' => 'color_5']
],
]
],
];

我想遍历$compare数组,找到需要比较的键,使用这些键访问db&数据数组,然后使用db数组中的值构建第三个嵌套数组(如果它们不同(。

给定三个输入,最终输出看起来像

$diff_array = [
'example_1' => [
'example_3' => [
"color.3" => "yellow",
]
],
'level_one' => [
'level_two' => [
'level_three' => [
'color.5' => "red"
]
]
],
];

在上面的color.1中没有包括,因为$compare对象中没有指定键,我们只想针对特定的键。

输出中不包括Color.2,因为它映射到db数组中的Color_2,并且它们已经相同。

之所以包含Color.3,是因为它在数据数组中是红色的,但数据库数组中的Color_3是黄色的。

颜色.4不包括在内,因为它与颜色_4(紫色(相同

因为数据库是红色的,而数据对象是棕色的,所以包含了颜色.5。

需要注意的是,在这个例子中,关键点只偏离了一个字符,但实际上它们可能完全不同,所以我们不能假设color_1总是映射到color.1。这就是为什么$compare对象包含我们要比较的项的两个键(data/db(。

我一直在探索RecursiveIteratorIterator和ArrayIdeator,但不确定在到达键映射所在的$compare数组中的子节点后,如何使用父信息访问$data数组的同一部分,以与$db数组进行比较。

$compare数组可以更改,因为这是我提出的一种识别嵌套数组到非嵌套数组映射的方法。

你试过我在发布的第二个答案中给你的PHP代码了吗

我还突然想到,你从未尝试过第一个答案中的链接
遍历JSON不动产列表的一个。我说过你可以用你的JSON来尝试一下

在你说的答案发布后"使用密钥访问数据";。所以我就是这么做的。使用了我遍历的密钥

对于这个回答,你说";访问特定密钥不是一个选项。正如我提到的,目标是遍历数组">
一直以来,答案都在第一个答案里。

我习惯了这个网络应用程序在第二个答案中创建密钥

我相信第一个应用程序正是你所需要的。我付出的比你需要的多得多。

k3: data_key => string: $json['example_1']['example_3'][0]['data_key'] => color.2
k3: database_key => string: $json['example_1']['example_3'][0]['database_key'] => color_2

这不是你需要的吗?仔细看看。把你不需要的东西拿走<这是剩下的。>

data_key => color.2
database_key => color_2 

所以你有了PHP代码。把它脱下来,这样你就只能得到你需要的了。

下面是使用data_array JSON的链接:data_array JSON遍历

最新更新