0

I have an array of json objects stored in database which are actually settings for Revolution slider. The string retrieved from database table and assigned to php variable look like this:

$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}
                    ]
                }
            ]
        }
    ]';

I can convert it to array of stdClass objects or array, whatever is needed. I have rendered page with all of those objects and used X-editable for changing values if needed. So when x-editable plugin sends new value for single object the values look like :

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

again I am able to build a json object string from these values:

$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.'}]';

and convert it to stdClass object or regular array. But I don't know how to test if new value is same as default value since the indexes are different. What I need is a function that will check if value for changed key is different as value in default object, if is different then return true if is same as default then return false.

2
  • 1
    Side note, why don't you use json_encode() to turn an array into json instead of making your own? Seems like you are leaving room for error since json_encode() will convert line returns and such which you are not doing.. Commented Nov 21, 2016 at 0:01
  • it does not exist as an array originally. I manually created that default json string following documentation of revolution slider to know what settings are available and what are their default values. I added there object "options" which holds possible options when available. So when i want to change some default values in administration and render them for particular slider, only objects with changed values will be stored in variable as default settings does not need to be rendered for slider script. Commented Nov 21, 2016 at 0:15

1 Answer 1

1

I am not 100% sure I understand what you are saying, but if you want to find the corresponding setting in a nested array, you can use a recursive function(s) to isolate a particular pattern or key/value pair. Here is an example:

/*
** @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;
        }
    }

The above function gives you this outcome based on this string navigation-arrows-left-container:

Array
(
    [26] => Array
        (
            [navigation] => Array
                (
                    [5] => Array
                        (
                            [arrows] => Array
                                (
                                    [10] => Array
                                        (
                                            [left] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [container] => slider
                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

If there is an array supplied like the above, it gets input into the next function

/*
** @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;
    }

To use:

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

The above array, given the same navigation-arrows-left-container string would give this final array:

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

)

You could combine some logic into just one function instead of the two I have, but that would take more work. This should be enough to go on.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.