php& json对象搜索和值检查

时间:2016-11-20 23:34:32

标签: php arrays json object

我有一个存储在数据库中的json对象数组,它们实际上是Revolution滑块的设置。从数据库表中检索并分配给php变量的字符串如下所示:

$json = '[
        {"sliderType": "standard","options": ["standard","carousel","hero"]},
        {"sliderLayout": "auto","options": ["auto","fullwidth","fullscreen"]},
        {"responsiveLevels": 4096},
        {"gridwidth": 1200},
        {"gridheight": 700},
        {"autoHeight": "off","options": ["on","off"]},
        {"minHeight": 0},
        {"fullScreenOffsetContainer": ""},
        {"fullScreenOffset": "0"},
        {"delay": 9000},
        {"waitForInit": false,"options": [true,false]},
        {"disableProgressBar": "off","options": ["on","off"]},
        {"startDelay": 0},
        {"stopAfterLoops": -1},
        {"stopAtSlide": -1},
        {"viewPort": [
                {"enable": false,"options": [true,false]},
                {"outof": "wait","options": ["wait","pause"]},
                {"visible_area": "60%"}
            ]
        },
        {"lazyType": "smart","options": ["full","smart","single","none"]},
        {"dottedOverlay": "none","options": ["none","twoxtwo","threexthree","twoxtwowhite","threexthreewhite"]},
        {"shadow": 0,"options": [0,1,2,3,4,5,6]},
        {"spinner": "spinner0","options": ["off", "spinner0", "spinner1","spinner2", "spinner3", "spinner4", "spinner5"]},
        {"debugMode": false,"options": [true,false]},
        {"extensions": "extensions/"},
        {"extensions_suffix": ".min.js"},
        {"fallbacks": [
                {"panZoomDisableOnMobile": "off","options": ["on","off"]},
                {"nextSlideOnWindowFocus": "off","options": ["on","off"]},
                {"disableFocusListener": true,"options": [true,false]}
            ]
        },
        {"parallax": [
                {"type": "off","options": ["off","mouse","scroll","mouse+scroll"]},
                {"levels": [10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85]},
                {"origo": "enterpoint","options": ["slidercenter","enterpoint"]},
                {"speed": 400},
                {"bgparallax": "on","options": ["on","off"]},
                {"disable_onmobile": "off","options": ["on","off"]}
            ]
        },
        {"carousel": [
                {"horizontal_align": "center","options": ["left","right","center"]},
                {"vertical_align": "center","options": ["top","bottom","center"]},
                {"infinity": "on","options": ["on","off"]},
                {"space": 0},
                {"maxVisibleItems": 3},
                {"stretch": "off","options": ["on","off"]},
                {"fadeout": "off","options": ["on","off"]},
                {"maxRotation": 0},
                {"minScale": 0},
                {"vary_fade": "off","options": ["on","off"]},
                {"vary_rotation": "on","options": ["on","off"]},
                {"vary_scale": "off","options": ["on","off"]},
                {"border_radius": "0px"},
                {"padding_top": 0},
                {"padding_bottom": 0}
            ]
        },
        {"navigation": [
                {"keyboardNavigation": "on", "options": ["on","off"]},
                {"keyboard_direction": "horizontal", "options": ["horizontal","vertical"]},
                {"mouseScrollNavigation": "off", "options": ["on","off"]},
                {"onHoverStop": "on", "options": ["on","off"]},
                {"touch": [
                        {"touchenabled": "on", "options": ["on", "off"]},
                        {"swipe_treshold": 75},
                        {"swipe_min_touches": 1},
                        {"drag_block_vertical": false, "options": [true, false]},
                        {"swipe_direction": "horizontal", "options": ["horizontal","vertical"]}
                    ]
                },
                {"arrows": [
                        {"style": ""},
                        {"enable": false, "options": [true, false]},
                        {"rtl": false, "options": [true, false]},
                        {"hide_onmobile": false, "options": [true, false]},
                        {"hide_onleave": true, "options": [true, false]},
                        {"hide_delay": 200},
                        {"hide_delay_mobile": 1200},
                        {"hide_under": 0},
                        {"hide_over": 9999},
                        {"tmp": ""},
                        {"left": [
                                {"container": "slider", "options": ["slider","layergrid"]},
                                {"h_align": "left", "options": ["left","center","right"]},
                                {"v_align": "center", "otpions": ["top","center","bottom"]},
                                {"h_offset": 20},
                                {"v_offset": 0}
                            ]
                        },
                        {"right": [
                                {"container": "slider", "options": ["slider","layergrid"]},
                                {"h_align": "left", "options": ["left","center","right"]},
                                {"v_align": "center", "otpions": ["top","center","bottom"]},
                                {"h_offset": 20},
                                {"v_offset": 0}
                            ]
                        }
                    ]
                },
                {"bullets": [
                        {"style": ""},
                        {"enable": false, "options": [true, false]},
                        {"rtl": false, "options": [true, false]},
                        {"container": "slider", "options": ["slider","layergrid"]},
                        {"hide_onmobile": false, "options": [true, false]},
                        {"hide_onleave": true, "options": [true, false]},
                        {"hide_delay": 200},
                        {"hide_delay_mobile": 1200},
                        {"hide_under": 0},
                        {"hide_over": 9999},
                        {"tmp": "<span class=\"tp-bullet-image\"></span><span class=\"tp-bullet-title\"></span>"},
                        {"direction": "horizontal", "options": ["horizontal","vertical"]},
                        {"space": 0},
                        {"h_align": "left", "options": ["left","center","right"]},
                        {"v_align": "center", "otpions": ["top","center","bottom"]},
                        {"h_offset": 20},
                        {"v_offset": 0}
                    ]
                },
                {"thumbnails": [
                        {"style": ""},
                        {"enable": false, "options": [true, false]},
                        {"rtl": false, "options": [true, false]},
                        {"container": "slider", "options": ["slider","layergrid"]},
                        {"width": 100},
                        {"height": 50},
                        {"wrapper_padding": 2},
                        {"wrapper_opacity": 1},
                        {"wrapper_color": "#f5f5f5"},
                        {"visibleAmount": 5},
                        {"hide_onmobile": false, "options": [true, false]},
                        {"hide_onleave": true, "options": [true, false]},
                        {"hide_delay": 200},
                        {"hide_delay_mobile": 1200},
                        {"hide_under": 0},
                        {"hide_over": 9999},
                        {"tmp": "<span class=\"tp-thumb-image\"></span><span class=\"tp-thumb-title\"></span>"},
                        {"direction": "horizontal", "options": ["horizontal","vertical"]},
                        {"span": false, "options": [true, false]},
                        {"position": "inner", "options": ["inner","outer-left","outer-right","outer-bottom","outer-top"]},
                        {"space": 0},
                        {"h_align": "left", "options": ["left","center","right"]},
                        {"v_align": "center", "otpions": ["top","center","bottom"]},
                        {"h_offset": 20},
                        {"v_offset": 0}
                    ]
                },
                {"tabs": [
                        {"style": ""},
                        {"enable": false, "options": [true, false]},
                        {"rtl": false, "options": [true, false]},
                        {"container": "slider", "options": ["slider","layergrid"]},
                        {"width": 100},
                        {"height": 50},
                        {"wrapper_padding": 2},
                        {"wrapper_opacity": 1},
                        {"wrapper_color": "#f5f5f5"},
                        {"visibleAmount": 5},
                        {"hide_onmobile": false, "options": [true, false]},
                        {"hide_onleave": true, "options": [true, false]},
                        {"hide_delay": 200},
                        {"hide_delay_mobile": 1200},
                        {"hide_under": 0},
                        {"hide_over": 9999},
                        {"tmp": "<span class=\"tp-thumb-image\"></span><span class=\"tp-thumb-title\"></span>"},
                        {"direction": "horizontal", "options": ["horizontal","vertical"]},
                        {"span": false, "options": [true, false]},
                        {"position": "inner", "options": ["inner","outer-left","outer-right","outer-bottom","outer-top"]},
                        {"space": 0},
                        {"h_align": "left", "options": ["left","center","right"]},
                        {"v_align": "center", "otpions": ["top","center","bottom"]},
                        {"h_offset": 20},
                        {"v_offset": 0}
                    ]
                }
            ]
        }
    ]';

我可以将它转换为stdClass对象或数组的数组,无论需要什么。 我已经使用所有这些对象呈现了页面,并在需要时使用X-editable来更改值。因此,当x-editable插件为单个对象发送新值时,值看起来像:

$_POST['name'] = 'navigation-arrows-left-container';
$_POST['value'] = 'customscontainer';
$_POST['pk'] = 1;

我再次能够从这些值构建一个json对象字符串:

$levels = explode('-', $_POST['name']);
$levels = array_reverse($levels);
$newjson = '';
foreach($levels AS $level){
    if($newjson == ''){
        $newjson = '"'.$level.'":"'.$_POST['value'].'"';
    }else{
        $newjson = '"'.$level.'":[{'.$newjson.'}]';
    }
}
$newjson = '[{'.$newjson.'}]';

并将其转换为stdClass对象或常规数组。 但我不知道如何测试新值是否与默认值相同,因为索引不同。我需要的是一个函数,它将检查更改键的值是否与默认对象中的值不同,如果不同则返回true如果与默认值相同则返回false。

1 个答案:

答案 0 :(得分:0)

我不是100%确定我理解你在说什么,但是如果你想在嵌套数组中找到相应的设置,你可以使用递归函数来隔离特定的模式或键/值对。这是一个例子:

/*
** @description This function will recurse the array and find a pattern
**              based on the supplied array
*/
function search_array($array,$setting)
    {
        if(empty($setting))
            return $array;

        foreach($array as $key => $value) {
            if(is_array($value)) {
                if(is_numeric($key)) {
                    $val    =   search_array($value,$setting);
                    if(!empty($val))
                        $new[$key]  =   $val;
                }
                else {
                    if(is_array($setting) && isset($setting[0])) {              
                        if($key == $setting[0]) {
                            unset($setting[0]);
                            $new[$key]  =   search_array($value,array_values($setting));
                        }
                    }
                }
            }
            else {
                if(is_array($setting) && isset($setting[0])) {
                    if($setting[0] == $key)
                        $new[$key]  =   $value;
                }
            }
        }

        if(!empty($new)) {
            return $new;
        }
    }

上述函数根据此字符串navigation-arrows-left-container

为您提供此结果
Array
(
    [26] => Array
        (
            [navigation] => Array
                (
                    [5] => Array
                        (
                            [arrows] => Array
                                (
                                    [10] => Array
                                        (
                                            [left] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [container] => slider
                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

如果有如上所述提供的数组,它将被输入到下一个函数

/*
** @description This will flatten an array and find a specific key
*/
function get_by_key($array,$search,&$save)
    {
        foreach($array as $key => $value) {
            if($key == $search) {
                $save[$key] =   $value;
            }
            else {
                if(is_array($value)) {
                    get_by_key($value,$search,$save);
                }
            }
        }
    }
/*
** @description This takes your post array and returns an array or false if it
**              can't find the key
*/
function get_setting($json,$POST)
    {
        # Set a storage array
        $save       =   array();
        # Explode the incoming string
        $settings   =   explode('-',$POST['name']);
        # Decode your json into an array for traversing
        $array      =   json_decode($json,true);
        # Run the search 
        $new        =   search_array($array,$settings);
        # If empty, just stop
        if(empty($new))
            return false;
        # Continue on with processing searching for the proper key
        get_by_key($new,array_pop($settings),$save);
        # Return the results of that search
        return (!empty($save))? $save : false;
    }

使用:

# The array input would be your $_POST array, I don't know how much you would
# like to do with the one function
print_r(get_setting($json,array('name'=>'navigation-arrows-left-container')));

上面的数组,给定相同的navigation-arrows-left-container字符串将给出这个最终数组:

Array
(
    [0] => Array
        (
            [container] => slider
        )

)

你可以将一些逻辑组合成一个函数而不是我的两个函数,但这需要更多的工作。这应该足够了。