簡體   English   中英

從PHP中的嵌套JSON對象中查找鍵值

[英]Find a Key Value from nest JSON object in PHP

如果值匹配,則嘗試刪除json對象。 我嘗試了許多方法,但是陷入了基於children的對象中。 這是我的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”的“子彈”,並刪除其中子彈包含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"
            }]
        }]
    }]
]

先感謝您)!

我對您的功能進行了一些更改。 我改用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;
    }
}

試試吧。 簡單實用。

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

只需更改函數名稱即可!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM