【问题标题】:How to convert a string to a multidimensional recursive array in PHP?如何在 PHP 中将字符串转换为多维递归数组?
【发布时间】:2018-09-08 20:55:14
【问题描述】:

我在使用 PHP 创建递归数组时遇到问题。

我需要将此字符串格式化为一个多维数组,其中以点分隔的元素表示数组键的多个级别。

$str = "code.engine,max_int.4,user.pre.3,user.data.4";

这个例子的输出是:

$str = array(
   "code" => "engine",
   "max_int" => 4,
   "user" => array(
      "pre" => 3,
      "data" => 4
   )
);

我将从 explode 函数开始,但我不知道如何从那里对其进行排序,或者如何完成 foreach。

【问题讨论】:

  • 你的意思是user.data.4而不是users.data.4
  • @Alejandro 我编辑假设users.data.4 是一个错字。如果我弄错了,你可以重新编辑,但如果你这样做了,请解释为什么会产生预期的输出。

标签: php arrays string recursion


【解决方案1】:

您可以使用逗号, 开始拆分,然后用点. 拆分每个项目,删除最后一部分以获得“值”,其余部分作为“路径”。最后,循环遍历“路径”来存储值:

$str = "code.engine,max_int.4,user.pre.3,user.data.4";

$array = [] ;
$items = explode(',',$str);
foreach ($items as $item) {
    $parts = explode('.', $item);
    $last = array_pop($parts);

    // hold a reference of to follow the path
    $ref = &$array ;
    foreach ($parts as $part) {
        // maintain the reference to current path 
        $ref = &$ref[$part];
    }
    // finally, store the value
    $ref = $last;
}
print_r($array);

输出:

Array
(
    [code] => engine
    [max_int] => 4
    [user] => Array
        (
            [pre] => 3
            [data] => 4
        )

)

【讨论】:

  • 做最好的...太好了太好了...是天才....哇,如果我能发送 100000 分 uffff pf 非常感谢
  • FYI... 没有if (!isset($ref[$part])) $ref[$part]=[]; 效果很好
  • 哦,是的。对@AbraCadaver。谢谢!但。嗯...为什么$ref = &$ref[$part] 不抛出“未定义索引”
  • @AbraCadaver 好的。那是因为参考。我们可以创建对未定义值 (3v4l.org/8pTaK) 的引用。
  • 我没有刷新我的窗口,也没有看到你找到它的评论:-) 注意:如果你通过引用分配、传递或返回一个未定义的变量,它将得到创建。 php.net/manual/en/language.references.whatdo.php
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 2015-03-22
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
相关资源
最近更新 更多