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对象数组,它们实际上是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}
]
}
]
}
]';
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 :
我可以将它转换为stdClass对象或数组的数组,无论需要什么。我已经使用所有这些对象呈现了页面,并在需要时使用X-editable来更改值。因此,当x-editable插件为单个对象发送新值时,值如下所示:
$_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:
我能够从这些值构建一个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.'}]';
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.
并将其转换为stdClass对象或常规数组。但我不知道如何测试新值是否与默认值相同,因为索引不同。我需要的是一个函数,它将检查更改键的值是否与默认对象中的值不同,如果不同则返回true如果与默认值相同则返回false。
1 个解决方案
#1
0
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:
我不是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;
}
}
The above function gives you this outcome based on this string navigation-arrows-left-container
:
上面的函数根据这个字符串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.
你可以将一些逻辑组合成一个函数而不是我的两个函数,但这需要更多的工作。这应该足以继续下去了。
#1
0
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:
我不是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;
}
}
The above function gives you this outcome based on this string navigation-arrows-left-container
:
上面的函数根据这个字符串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.
你可以将一些逻辑组合成一个函数而不是我的两个函数,但这需要更多的工作。这应该足以继续下去了。