我正在创建一个帮助构建WordPress插件设置页面的类。开发人员通过传入一组设置来实例化该类。一个基本的例子如下:
Array
(
[textbox1] => Array
(
[title] => Textbox
[type] => text
[section] => general
[desc] => The text description
)
[a_nice_dropdown] => Array
(
[title] => Select me
[type] => select
[section] => general
[desc] => The select description
[choices] => Array
(
[red] => Red
[blue] => Blue
[green] => Green
)
)
)
这很好用。我的类构建了选项页面,输入的HTML看起来像:
<input id="textbox1" type="text" name="options_slug[textbox1]" value="">
何时&#34;保存更改&#34;单击,我的班级抓住所有与&#34; options_slug&#34;相关的选项。并将它们作为一个漂亮的序列化数组存储在一个wp_options条目中,以便以后轻松获取。
新挑战
我有一个新项目需要多个嵌套&#34;转发器&#34;字段,类似于高级自定义字段处理它的方式。我已经创建了一个新的字段类型来处理它,它可以支持&#34;子字段&#34;。示例配置输出(来自error_log)如下所示:
Array
(
[subfields_container] => Array
(
[title] => Subfields
[type] => subfields
[section] => general
[desc] => This is the subfields description text
[subfields] => Array
(
[textbox2] => Array
(
[title] => Textbox
[type] => text
[section] => general
[desc] => The text description
)
[select1deep] => Array
(
[title] => Subfield Select
[type] => select
[choices] => Array
(
[1] => 1
[2] => 2
[3] => 3
)
[std] => 1
)
)
)
)
我已经配置了HTML输出,因此输入了一个&#34;子字段&#34;容器现在看起来像:
<input id="textbox1" type="text" name="options_slug[subfields_container][textbox2]" value="">
最终用户可以轻松地对字段进行分组:即,
$options = get_option('options_slug');
foreach($options['subfield_container'] as $subfield) {
// etc...
}
问题
当我遍历这些多维数组时,我需要在当前索引处不断更新$ options变量,以便将其保存到数据库中。所以以前我能够做到:
$id = 'textbox1';
$options[$id] = $_POST['textbox1'];
现在我做了类似的事情:
$id = array('subfields_container' => 'textbox2');
$options[$id] = $_POST['textbox2'];
但我得到了#34;非法偏移类型&#34;错误。因为我无法使用另一个数组设置数组属性。
我考虑过将破折号放入ID而不是创建分层数组,例如:
<input id="textbox1" type="text" name="options_slug[subfields_container-textbox2]" value="">
然而,我将失去对存储选项的特定部分进行预告的能力。
问题
当数组未在结构中修复时,在多维数组中动态设置值的最佳方法是什么?
谢谢
答案 0 :(得分:1)
我建议只是动态创建一个多级数组:
$arr = array();
$arr['subfields_container']['textbox1'] = $_POST['textbox1'];
print_r($arr);
=&GT;
Array
(
[subfields_container] => Array
(
[textbox1] => <POSTed value>
)
)
无论您指定的嵌套级别数是多少,都将动态创建所有不存在的键。
<强>更新强>
鉴于用户可以随意指定任何数量的嵌套级别,如下所述,您可能需要一个递归函数来返回当前级别的所有元素的值,并调用自身来检索任何元素的值。包含子元素的当前级别。
示例:
function getNestedPostVars($config, $formName, $keys = array()) {
$output = [];
foreach ($config as $label => $fieldConfig) {
if (isset($config['subfields'])) {
$output[$label] = getNestedPostVars(
$config['subfields'],
$formName,
array_merge($keys, array($label))
);
continue;
}
$output[$label] = /* path to $_POST element using $keys/$label */ ;
}
return $output;
}