在选项中处理嵌套数组的方法

时间:2012-12-26 作者:dfens

我偶然发现了一个问题,即选项字段中存储的数据结构太复杂(至少在我看来)。

现在我有一个集合数组,每个集合中都有另一个子集合(如下所示)。在我看来,这看起来太复杂了,尤其是当一个人想在里面储存一些价值的时候。或多或少,它看起来像:

$collection = get_option(\'collection_setting\');
$collection[1][elements][0][name] = "ChangedExample";
当我们想在集合中引入另一个数组时,情况可能会变得更糟。此外,我认为如果每个数组使用100个条目,那么它可能会变得非常草率。

我的问题是如何改进这一点?将其存储到两个不同的选项字段中—一个用于集合,另一个用于子集合,然后以某种方式尝试在代码中连接它?或者这完全可以?

当然,我假设在DB中创建另一个表不是最优雅的方式。

Array
(
  [0] => Array
      (
        [name] => collection_name
        [speed] => 200
        [id] => collection_name_1
        [max_elements_per_page] => 13
        [elements] => Array
            (
                [0] => Array
                    (
                        [id] => 1
                        [url] => http://www.example1.org
                        [name] => Example1
                    )

                [1] => Array
                    (
                        [id] => 2
                        [url] => http://www.example2.org
                        [name] => Example2
                    )

                [2] => Array
                    (
                        [id] => 3
                        [url] => http://www.example3.org
                        [name] => Example4
                    )

            )

    )

[1] => Array
    (
        [name] => collection_name_2
        [speed] => 200
        [id] => collection_name_2
        [max_elements_per_page] => 13
        [elements] => Array
            (
                [0] => Array
                    (
                        [id] => 1
                        [url] => http://www.example1.org
                        [name] => Example1
                    )

                [1] => Array
                    (
                        [id] => 2
                        [url] => http://www.example2.org
                        [name] => Example2
                    )

                [2] => Array
                    (
                        [id] => 3
                        [url] => http://www.example3.org
                        [name] => Example4
                    )

            )

    )

)
例如,当我在设置页面上只想编辑集合的第一个元素,然后在保存时,Wordpress会用表单中提交的值覆盖整个选项,从集合中删除第二个元素(此处删除$collection[1])。

出路是什么?我正在考虑使用validate\\u options函数(从设置页面接收数据)。我可以检索collection\\u设置,相应地修改它并返回修改后的collection\\u设置。

register_setting(\'collection-settings-group\', \'collection_setting\', \'validate_options\');
但我认为这是太多的工作,我相信有更好的解决办法。

1 个回复
最合适的回答,由SO网友:Ralf912 整理而成

这是使用类管理数据结构的典型情况。您有一个复杂的数据结构,需要一些函数来检索和修改数据结构。这是一个简单的类。

该类从数据库中获取数据结构,并有一些方法来获取部分数据结构或对其进行修改。

我写了一个sample class, 您可以使用自己的方法对其进行扩展或修改。使用该类非常简单:

  <?php
  // creating an instance of the class and retrieve the data from db
  $collections = new CollectionsManager();

  // get a collection by it\'s id
  $sample_collection = $collection->get_collection_by_id( \'sample_collection\' );

  // get the elements of the sample collection
  $sample_elements = $collection->get_elements_by_id( \'sample_collection\' );

  // insert an alement
  $new_element = array( \'id\' => 5, \'name\' => \'new_element\', \'url\' => \'http://wordpress.stackexchange.com\' );
  $new_element_id = $collection->insert_element_by_id( \'sample_collection\', $new_element );

I wrote this class from scratch and it is not been tested yet. Maybe it\'s buggy in some parts. I give no warranty for bugless functionality!

结束

相关推荐

Custom order for Mysql array

我有一页帖子,每篇帖子都有一个自定义字段“expired”,其中包含一个YYYY-MM-DD格式的日期,用于订购帖子。该日期用于一个脚本,该脚本告诉访问者优惠是否已过期或有效期是否超过X天。我的数组如下:$postid = get_the_ID(); $meta1 = get_post_meta($postid, \'shop\', true); $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;