【发布时间】:2021-10-22 11:45:52
【问题描述】:
我想合并两个数组来比较新旧值。例如,$arr1 是旧值 $arr2 是新值。
如果数据被删除 $arr2 是一个空数组。示例:
$arr1 = [
"databases" => [
0 => [
"id" => 1
"name" => "DB1"
"slug" => "db1"
"url" => "https://www.db1.org"
]
]
];
$arr2 = [];
为此,我在合并后的预期输出是
$merged = [
"databases" => [
0 => [
"id" => [
'old' => 1,
'new' => null
],
"name" => [
'old' => "DB1",
'new' => null
],
"slug" => [
'old' => "db1",
'new' => null
],
"url" => [
'old' => "https://www.db1.org",
'new' => null
],
]
]
];
如果 arr2 不同,则值应出现在 new 字段中,而不是 null。
例如:
$arr1 = [
"databases" => [
0 => [
"id" => 1
"name" => "DB1"
"slug" => "db1"
"url" => "https://www.db1.org"
]
]
];
$arr2 = [
"databases" => [
0 => [
"id" => 5
"name" => "DB2"
"slug" => "db2"
"url" => "https://www.db2.com"
]
]
];
预期输出:
$merged = [
"databases" => [
0 => [
"id" => [
'old' => 1,
'new' => 5
],
"name" => [
'old' => "DB1",
'new' => "DB2"
],
"slug" => [
'old' => "db1",
'new' => "db2"
],
"url" => [
'old' => "https://www.db1.org",
'new' => "https://www.db2.com"
],
]
]
];
情况 3 是 $arr1 为空但 $arr2 已填充:
$arr1 = [];
$arr2 = [
"databases" => [
0 => [
"id" => 1
"name" => "DB1"
"slug" => "db1"
"url" => "https://www.db1.org"
]
]
];
预期的输出是:
$merged = [
"databases" => [
0 => [
"id" => [
'old' => null,
'new' => 1
],
"name" => [
'old' => null,
'new' => "DB1"
],
"slug" => [
'old' => null,
'new' => "db1"
],
"url" => [
'old' => null,
'new' => "https://www.db1.org"
],
]
]
];
内置的 php 函数无法格式化 old 和 new 格式的数据,所以想知道如何解决这个问题?任何解决方案/建议将不胜感激。
更新
这是我之前尝试过的:
- 我尝试过简单的
array_merge_recursive,但它不存储源数组。因此,如果您没有$arr1键,则最终合并的数组将只有一个值。 - 我尝试了一些更多的递归函数深夜但失败了,所以基本上没有任何东西可以显示我尝试过的东西。但是,今天早上,我想出了解决方案并将其发布为答案,以防有人需要使用它。
【问题讨论】:
-
嗨!目前,这个问题读起来有点像希望有人为你做你的工作。如果您自己尝试一下,并展示您想出的代码以及您认为哪里出了问题,您可能会得到更好的帮助。
-
@IMSoP 抱歉,我放弃并发布此内容时已是深夜。现在我又读了一遍,是的,听起来确实如此。我已经想出了一个解决方案,并将其作为答案发布,以防其他人需要这个。我只需要再测试一下。
-
注册。 “怎么办?”:为什么不设置两个数组,一个用于old,另一个用于new。然后获取密钥并进行各种操作。
+数组运算符可能会派上用场。只是一些想法。