【问题标题】:PHP - Access an array using another array as the keyPHP - 使用另一个数组作为键访问一个数组
【发布时间】:2015-08-04 12:31:09
【问题描述】:

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

当点击“保存更改”时,我的班级会抓取与“options_slug”相关的所有选项,并将它们作为一个很好的序列化数组存储在一个 wp_options 条目中,以便以后轻松抓取。

新挑战

我有一个需要多个嵌套“中继器”字段的新项目,类似于高级自定义字段的处理方式。我创建了一个新的字段类型来处理这个,它可以支持“子字段”。示例配置输出(来自 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 输出,因此“子字段”容器内的输入现在看起来像:

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

但我收到“非法偏移类型”错误。因为我无法使用另一个数组设置数组属性。

我考虑过只在 ID 中添加破折号,而不是创建分层数组,例如:

<input id="textbox1" type="text" name="options_slug[subfields_container-textbox2]" value="">

但是我将失去对存储选项的特定部分进行 foreach 的能力。

问题

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

谢谢

【问题讨论】:

  • 您可能应该查找此类的类,对象类似于数组,但您可以创建简化设置属性值的方法。

标签: php arrays wordpress multidimensional-array


【解决方案1】:

我建议只动态创建一个多级数组:

$arr = array();

$arr['subfields_container']['textbox1'] = $_POST['textbox1'];

print_r($arr);

=>

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

【讨论】:

  • 这会起作用,除非我不知道数组是两层还是十层,它是由用户在配置选项页面时生成的。例如,在我开始进行这些更改之前,我将发布一个单维数组,我将对其进行遍历,验证每个条目,并将设置存储在另一个变量 ($options) 中。现在我需要遍历一个多维数组,并能够在保留数组结构的同时更新 $options 中的相应值。
猜你喜欢
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2021-02-11
  • 2015-08-07
  • 2011-06-08
相关资源
最近更新 更多