从PHP中的嵌套JSON对象中查找键值
如果值匹配,我将尝试删除json对象。我尝试了很多方法,但都陷入了基于从PHP中的嵌套JSON对象中查找键值,php,json,Php,Json,如果值匹配,我将尝试删除json对象。我尝试了很多方法,但都陷入了基于的对象中。下面是我的json的样子: [{ "id": "gx14jg", "split": "", "slug": "f4-1", "url": "", "name": "f4", "type": "other_type_first-category", "class": "undefined" }, {
的对象中。下面是我的json的样子:
[{
"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”的“slug”,并移除slug中包含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"
}]
}]
}]
]
(提前)谢谢你 我对您的功能做了一些更改。我不得不改用reference。检查此解决方案
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;
}
}
公共函数检查类别luginnavigation(&$nav,$slug){/$navVal){
如果(isset($navVal->slug)和&$navVal->slug==$slug){
未设置($nav[$key]);
}
否则{
if(is_array($navVal))//checkCategorySlugInNavigation($navVal,$slug);
}
}
}
$ArrayRemoved[]=$nav//slug==$slug){
未设置($nav[$key]);
}否则{
如果(array_key_存在('children',$nav)){
$nav_tmp=$this->checkCategorySlugInNavigation($nav->children,$slug);//children);//试试看。简单实用
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刚刚在Last中添加了预期结果谢谢您的尝试,我正在尝试将其放入我的代码中,并在2分钟内告知您:)它几乎成功了,它将“children”保留为空数组,因为它是数组中唯一的对象。因此我想删除“children”还有,如果它是唯一的对象。有什么问题吗?仍然是“子对象”似乎有一个空数组。你有没有找到其他对象?else{if($nav->slug=$slug){unset($nav[$key]);}else{if(array_key_存在('children',$nav)){$nav_tmp=$this->checkCategorySlugInNavigation($nav->children,$slug);//children)//