【问题标题】:PHP explode string key into multidimensional array with valuesPHP将字符串键分解为具有值的多维数组
【发布时间】:2016-09-18 07:00:02
【问题描述】:

我有一个数组:

$array = [
    "main;header;up" => "main_header_up value",
    "main;header;bottom" => "main_header_bottom value",
    "main;bottom" => "main_bottom value",
    "main;footer;right;top" => "main_footer_right_top value"
];

我想要得到的是将数组键分解为多维数组,但保留值,结果应该与该数组等效:

$array = [
    "main" => [
        "header" => [
            "up" => "main_header_up value", 
            "bottom" => "main_header_bottom value"
        ],
        "bottom" => ["main_bottom value"],
        "footer" => [
            "right" => [
                "top" => "main_footer_right_top value
            ]
        ]
    ]
];

我想我应该声明; 的数量不是预先确定的。键/索引中可能没有,也可能有 10 个(或更多)。

有什么优雅的方法可以实现这一点吗?

【问题讨论】:

  • 我认为explode 与这里无关。您可以编写自己的函数来解析此类输入。我建议使用嵌套对象(即main->header->upmain->bottom..)等
  • 是的,我也会去找对象。我认为一旦完成json_decode / json_encode,以这种方式处理数组会容易得多。
  • explode 是解决方案的一部分,但不是棘手的问题。棘手的是,您必须编写自己的函数来将这些结果数组传输到多维数组/对象中,同时将值保存在正确的位置。
  • @Jeff 确切地说,我可以按照我想要的方式将新数组组织到新数组中,但使用一个空数组作为值。我认为可能有一种优雅的方式来处理我不知道的这种情况。

标签: php arrays multidimensional-array


【解决方案1】:

这是我用来做这样的事情的:

$result = array();

foreach($array as $path => $value) {
    $temp =& $result;

    foreach(explode(';', $path) as $key) {
        $temp =& $temp[$key];
    }
    $temp = $value;
}
    
print_r($result);
  • 循环数组和explode(); 上的键
  • 循环分解的值并根据这些值创建嵌套键
  • 将原始数组元素的值赋给最后一个键

如果您需要一些功能来执行此操作,我对 How to write getter/setter to access multi-level array by key names? 的回答可能会有所帮助。

【讨论】:

  • 这正是我所做的,我只是分配了一个空数组!没看到那个来了:)
  • 多年的编码,我根本无法理解这段代码......很好,所以......
【解决方案2】:

解决办法

<?php
$array = [
    "main;header;up" => "main_header_up value",
    "main;header;bottom" => "main_header_bottom value",
    "main;bottom" => "main_bottom value",
    "main;footer;right;top" => "main_footer_right_top value"
];

$result = [];

foreach ($array as $implodedKeys => $value) {
    $keys = array_reverse(explode(';', $implodedKeys));
    $tmp = $value;
    foreach ($keys as $key) {
        $tmp = [$key => $tmp];
    }
    $result = array_merge_recursive($result, $tmp);
}
var_dump($result);

一些解释: 首先迭代您给定的数组,从每一行分解键并将它们反转。现在我们可以遍历这些键并从内到外构建每个数组。最后,您可以将它与结果递归地合并。 这不是最有效的解决方案,但表明有很多方法可以解决问题

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2017-12-07
    • 2015-02-13
    • 2012-06-10
    相关资源
    最近更新 更多