【问题标题】:Convert flat data table into multidimensional array将平面数据表转换为多维数组
【发布时间】:2012-02-06 05:48:56
【问题描述】:

我有这个数据(列是深度、名称、值,顺序正确):

0, id,    12
0, name,  Name
0, pages,
1, 0,     Page 1
1, 1,     Page 2
1, 2,     Page 3
0, items,
1, 0,
2, id,    4
2, title, Example Items

我正在尝试从中生成这样的数组结构:

Array
(
    [id] => 12
    [name] => Name
    [pages] => Array
        (
            [0] => Page 1
            [1] => Page 1
            [2] => Page 1
        )
    [items] => Array
        (
            [0] => Array
                (
                    [id] => 4
                    [title] => Example Item
                )
        )
)

到目前为止,我尝试过的每一次尝试都失败了,我似乎无法理解逻辑。任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • 这是 csv 还是数据来自哪里?
  • 除非您添加列parent,否则我认为您无法知道Page 1Pages 的子代,但无法保证顺序(除非还有顺序列)你没有提到)。您可能想查看Binary Trees,它具有定义明确的算法来帮助处理此类情况(并允许您将多维数据存储在单个表中)
  • 抱歉,我要澄清一下,顺序是固定且正确的,因此可以计算出完整的层次结构。

标签: php recursion multidimensional-array


【解决方案1】:

您可以通过一些参考技巧来完成此操作。如果您将 CSV 输入转换为如下列表:

$in = array_map("str_getcsv", explode("\n", $table));

然后你可以像这样遍历它:

$data = array();

foreach ($in as $row) {
    list ($depth, $key, $value) = $row;

    $r = & $data;  // start from base array, then submerge $n last keys
    while ($depth--) { end($r); $r = & $r[key($r)]; }

    $r[$key] = $value;
}

至少适用于您的示例:

Array
(
    [id] => 12
    [name] => Name
    [pages] => Array
        (
            [0] => Page 1
            [1] => Page 2
            [2] => Page 3
        )

    [items] => Array
        (
            [0] => Array
                (
                    [id] => 4
                    [title] => Example Items
                )

        )

)

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多