2017-06-22 111 views
0

我试图如果值匹配,除去一个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数组,而$slugf3

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" 
      }] 
     }] 
    }] 
] 

谢谢(提前)!

+1

预期结果是什么? – axiac

+0

@axiac刚添加和去年 – user3201500

回答

0

我做你的函数的一些变化。我使用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; 
    } 
} 
+0

预期成果谢谢你试试,我试图把这个在我的代码,让你在2分钟内知道:) – user3201500

+0

它几乎工作,它留下的“孩子”为空白阵列,因为它是数组中唯一的对象。所以我想删除“孩子”,如果它是唯一的对象。 – user3201500

+0

检查编辑的代码。我在其他部分进行了更改 –

0

试试吧。简单而实用。

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))); 

只是更改函数名!