【发布时间】:2019-05-23 07:27:50
【问题描述】:
我的目标是有一个函数可以删除指定的 json 子级,它也可以嵌套在更深的内部。
我的函数如下所示:
private function removeJsonChild(String $jsonKey, String $jsonString)
{
$json = json_decode($jsonString, true);
$arr_index = array();
foreach ($json as $key => $value) {
if (is_array($value)) {
$json[$key] = $this->removeJsonChild($jsonKey, json_encode($value));
}
if ($key == $jsonKey) {
$arr_index[] = $key;
}
}
foreach ($arr_index as $i) {
unset($json[$i]);
}
return json_encode($json);
}
如果我不检查 $value 是否是一个数组,然后再次递归调用该函数,该函数将起作用。但是我认为有问题。在我将函数的返回值分配给$json[$key] 的语句中。我做错了什么?
编辑:肯定忘记了json_decode。新代码如下所示:
private function removeJsonChild(String $jsonKey, String $jsonString)
{
$json = json_decode($jsonString, true);
$arr_index = array();
foreach ($json as $key => $value) {
if (is_array($value)) {
$json[$key] = json_decode($this->removeJsonChild($jsonKey, json_encode($value)));
}
if ($key == $jsonKey) {
$arr_index[] = $key;
}
}
foreach ($arr_index as $i) {
unset($json[$i]);
}
return json_encode($json);
}
EDIT2:
该函数现在可以工作,但是它稍微改变了 json 架构。
这样的 JSON:
[
{
"id": 1,
"name": "oyzadsaigny647"
}
]
现在变成这样:
{
"1": {
"id": 1,
"name": "oyzadsaigny647"
}
}
【问题讨论】:
-
首先,这里的职责分离。编写一个可以从数组中删除键的递归函数。然后编写第二个函数,它关心 JSON 的编码/解码。
-
它可以与 json_decode 一起使用吗?
-
查看我上次的编辑
-
这看起来像是一个学习 TDD 的完美示例项目 - 尝试编写测试用例,从最简单的用例开始,以满足该要求。如果沿途没有成功,请分享您的尝试