查找巢JSON对象键值在PHP
我试图如果值匹配,除去一个JSON对象。我尝试了很多方法,但陷入了基于children
的对象。这里是我的JSON的样子:查找巢JSON对象键值在PHP
[{
"id": "gx14jg",
"split": "",
"slug": "f4-1",
"url": "",
"name": "f4",
"type": "other_type_first-category",
"class": "undefined"
}, {
"id": "bo3m0q",
"split": 2,
"slug": "\/",
"url": "",
"name": "home",
"type": "page",
"class": ""
},
[{
"id": "g3qjsv",
"split": "",
"slug": "demo",
"url": "",
"name": "demo",
"type": "page",
"class": "",
"children": [{
"id": "r318jh",
"url": "",
"slug": "f4-1",
"name": "f4",
"type": "other_type_first-category",
"class": "undefined",
"children": [{
"id": "hztbje",
"url": "",
"slug": "f3",
"name": "f3",
"type": "other_type_first-category",
"class": "undefined"
}]
}]
}],
[{
"id": "r9s608",
"split": "",
"slug": "demo2",
"url": "",
"name": "demo2",
"type": "category",
"class": "undefined",
"children": [{
"id": "dlk12g",
"url": "",
"slug": "asddddddddd",
"name": "asddddddddd",
"type": "category",
"class": "undefined"
}]
}],
[{
"id": "qg6c3p",
"split": 2,
"slug": "motorola",
"url": "",
"name": "Motorola",
"type": "product-category",
"class": "moto",
"children": [{
"id": "rem23f",
"url": "",
"slug": "indian-resturants",
"name": "Indian Resturants",
"type": "Service-category",
"class": "undefined",
"children": [{
"id": "kpwiq0",
"url": "",
"slug": "f4-1",
"name": "f4",
"type": "other_type_first-category",
"class": "undefined"
}]
}]
}]
]
我必须找出一个“塞”与价值“F3”,并删除相同的对象其中弹头持有F3。
这里是我迄今为止尝试过。其中$ nav是那个json数组,而$slug
是f3
。
public function checkCategorySlugInNavigation($nav, $slug){
$ArrayRemoved = [];
if(is_array($nav)){
foreach($nav as $key=>$navVal){
if($navVal->slug == $slug){
unset($nav[$key]);
}
else{
if(array_key_exists('children', $navVal)){
$navVal = $this->checkCategorySlugInNavigation($navVal, $slug);
}
$ArrayRemoved[] = $navVal;
}
}
} else{
if($nav->slug == $slug){
unset($nav[$key]);
} else{
if(array_key_exists('children', $nav)){
$nav = $this->checkCategorySlugInNavigation($nav->children, $slug);
}
$ArrayRemoved[] = $nav;
}
}
return $ArrayRemoved;
}
任何支持的答案都会对此有所帮助。
预期结果将是:
[{
"id": "gx14jg",
"split": "",
"slug": "f4-1",
"url": "",
"name": "f4",
"type": "other_type_first-category",
"class": "undefined"
}, {
"id": "bo3m0q",
"split": 2,
"slug": "\/",
"url": "",
"name": "home",
"type": "page",
"class": ""
},
[{
"id": "g3qjsv",
"split": "",
"slug": "demo",
"url": "",
"name": "demo",
"type": "page",
"class": "",
"children": [{
"id": "r318jh",
"url": "",
"slug": "f4-1",
"name": "f4",
"type": "other_type_first-category",
"class": "undefined"
}]
}],
[{
"id": "r9s608",
"split": "",
"slug": "demo2",
"url": "",
"name": "demo2",
"type": "category",
"class": "undefined",
"children": [{
"id": "dlk12g",
"url": "",
"slug": "asddddddddd",
"name": "asddddddddd",
"type": "category",
"class": "undefined"
}]
}],
[{
"id": "qg6c3p",
"split": 2,
"slug": "motorola",
"url": "",
"name": "Motorola",
"type": "product-category",
"class": "moto",
"children": [{
"id": "rem23f",
"url": "",
"slug": "indian-resturants",
"name": "Indian Resturants",
"type": "Service-category",
"class": "undefined",
"children": [{
"id": "kpwiq0",
"url": "",
"slug": "f4-1",
"name": "f4",
"type": "other_type_first-category",
"class": "undefined"
}]
}]
}]
]
谢谢(提前)!
我做你的函数的一些变化。我使用refrence来代替。检查这个解决方案
public function checkCategorySlugInNavigation(&$nav, $slug){ //<---pass by reference so unset will effect on real result
$ArrayRemoved = [];
if(is_array($nav)){
foreach($nav as $key=>$navVal){
if(isset($navVal->slug) && $navVal->slug == $slug){
unset($nav[$key]);
}
else{
if(is_array($navVal)) //<--- In your example children exist in array so need to check it also
$navVal = (isset($navVal[0]))?$navVal[0]:$navVal;
if(array_key_exists('children', $navVal)){
$navVal = $this->checkCategorySlugInNavigation($navVal, $slug);
}
}
}
$ArrayRemoved[] = $nav; //<---- add array at end
} else{
if($nav->slug == $slug){
unset($nav[$key]);
} else{
if(array_key_exists('children', $nav)){
$nav_tmp = $this->checkCategorySlugInNavigation($nav->children, $slug); //<-------update this
if(count($nav_tmp) == 0)
unset($nav->children); //<---- unset value
}
}
}
return $ArrayRemoved;
}
}
预期成果谢谢你试试,我试图把这个在我的代码,让你在2分钟内知道:) – user3201500
它几乎工作,它留下的“孩子”为空白阵列,因为它是数组中唯一的对象。所以我想删除“孩子”,如果它是唯一的对象。 – user3201500
检查编辑的代码。我在其他部分进行了更改 –
试试吧。简单而实用。
function remove_f3_children($array) {
foreach($array as $key => &$value) {
if(is_array($value) && isset($value[0]->children)) {
$val = remove_f3_children($value[0]);
if($val->children === null)
unset($value[0]->children);
else
$value = $val;
}
if(is_array($value) && ! isset($value[0]->children)) {
if(array_search('f3', (array) $value[0]) == 'slug')
$value = null;
}
}
return $array;
}
print_r(remove_f3_children(json_decode($json)));
只是更改函数名!
预期结果是什么? – axiac
@axiac刚添加和去年 – user3201500