【问题标题】:Building multidimensional array dynamically动态构建多维数组
【发布时间】:2012-10-19 16:07:05
【问题描述】:

我的意图是获取一系列字符串,用“_”分解它们并使用该数组中的键构建一个“主”数组。

我的规则是:

if key no exists -> create key under parent array
if key exists -> add key as new array to parent
if key is last -> add value

字符串示例

total_players_count
total_rosters_count
players_season1_count
players_season2_count
rosters_season1_count

预期结果

$main = array(
    'total' => array(
        'players'   => array(
            'count' => '123',
        'rosters'   => array(
            'count' => '123')
        )
    ),
    'players' => array(
        'season1'   => array(
            'count' => '123'
        )
    )
);

我希望这能显示出我期望写的内容。现在让我来谈谈昨晚我是如何因一系列失败而让自己失望的;)

要点是,我的递归函数运行得不太好,所以我没有发布任何代码。我一直在使用 array_key_exists,但这并没有让我得到预期的结果。我使用 prev()、current() 和 end() 接近了,但问题源于我必须解析的意外数量的键(否则我只会循环 3 次并完成。我知道如果我要解析的键数量有限;但我没有。

<?php
private function _get_section($parent_key, $sql) {

        $data = array();
        $data[$parent_key] = array();

        foreach ($sql AS $key => $value) {
            $keys       = explode('_', $key);

            if ($keys[0] == $parent_key) {
                $i          = 0;
                $total_keys = count($keys);

                for ($k = 1; $k < $total_keys; $k++) {
                    $i++;

                    if ($i == 1) {
                        echo '1. (' . $i . ') ' . $keys[$k];
                        $data[$parent_key][$keys[$k]] = array();
                    }
                    else if ($i > 1 && $i < $total_keys - 1) {
                        $data[$parent_key][$keys[$k - 1]][$keys[$k]] = array();
                    }
                    else if ($i == $total_keys - 1) {
                        $tmp = array_reverse($data);

                        // can't get the last key because I need to recursively loop 
                        // through the results to find where to set this last 
                        // key / value
                    }
                }
                $k      = 0;
                $i      = 0;
            }

            $keys       = array();
            $total_keys = 0;
        }
    }

解决方案(谢谢)

$tree = array();

foreach ($sql AS $key => $value) {
    $parts = explode('_', $key);

    $val = $value;

    foreach (array_reverse($parts) AS $part) {
        $val = array($part => $val);
    }
    $tree = array_merge_recursive($tree, $val);
}

【问题讨论】:

    标签: php recursion multidimensional-array


    【解决方案1】:

    未经测试。希望我不需要阅读您的代码即可完全理解您想要什么,因为我没有。我只是查看了预期结果 + 输入,虽然我想知道 rosters_season1_count 发生了什么?

    $tree = array();
    foreach ($strings as $string) {
        $parts = explode('_', $string);
        $path = '123';
        foreach (array_reverse($parts) as $part) {
            $path = array($part => $path);
        }
        $tree = array_merge_recursive($tree, $path);
    }
    

    【讨论】:

    • 太棒了,让我试一试,看看我能做些什么。猜猜是深夜,但我从没想过使用array_merge_recursive。当我尝试递归合并数组时,这很有意义。
    • 哦,还有 rosters_season1_count 被删除了,因为我忘了将它添加到测试数据中。对不起。
    • 成功了。将使用解决方案编辑我的帖子(与您所做的几乎相同)。可悲的是我昨晚看了这个功能并通过了它。任何人,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多