将PHP字符串键分解为具有值的多维数组

10

我有一个数组:

$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..)等。 - FindOut_Quran
是的,我也会选择对象。我认为一旦使用json_decode / json_encode处理数组将会更容易。 - Revenant
explode是解决方案的一部分,但并不是最棘手的部分。最棘手的是,您将需要编写自己的函数,将这些结果数组转换为多维数组/对象,并确保值放在正确的位置上。 - Jeff
@Jeff 确切地说,我可以按照自己想要的方式将新数组组织成一个包含空数组值的数组。我认为可能有一种优雅的方式来处理这种我不知道的情况。 - Revenant
2个回答

13

这是我用于此类事情的方式:

$result = array();

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

    foreach(explode(';', $path) as $key) {
        $temp =& $temp[$key];
    }
    $temp = $value;
}
    
print_r($result);
  • 循环遍历数组并在 ; 上使用 explode() 函数将键值拆分
  • 循环遍历拆分后的值并从这些值创建嵌套键
  • 将原始数组元素的值分配给最后一个键

如果您需要一些函数来执行此操作,可以参考我对如何编写访问多级数组的getter/setter方法?问题的回答。


这是我所做的,我只是分配了一个空数组!没想到会这样 :) - Revenant
多年的编程经验,我仍然无法理解这一块代码...不过它能正常工作,所以... - Volmarg Reiso

8
这里提供解决方案。
<?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);

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接