PHP - 使用另一个数组作为键访问数组

时间:2015-08-04 12:31:09

标签: php arrays wordpress multidimensional-array

我正在创建一个帮助构建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="">

然而,我将失去对存储选项的特定部分进行预告的能力。

问题

当数组未在结构中修复时,在多维数组中动态设置值的最佳方法是什么?

谢谢

1 个答案:

答案 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;
}