V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tellmeworld
V2EX  ›  程序员

百思不得其解: PHP 怎么把一维数组的键值转化为多维数组的键名

  •  
  •   tellmeworld · 2022-01-12 15:44:36 +08:00 · 1688 次点击
    这是一个创建于 806 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如$arr=array('a','b','c','d'); 长度不固定;

    要变成$arr['a']['b']['c']['d'], 按照顺序的;

    请问有啥办法?

    14 条回复    2022-01-14 11:00:03 +08:00
    dajj
        1
    dajj  
       2022-01-12 15:52:11 +08:00
    太简单了, 你再想想
    FaceBug
        2
    FaceBug  
       2022-01-12 15:52:26 +08:00   ❤️ 1
    那你的值是什么呢? null ?
    tellmeworld
        3
    tellmeworld  
    OP
       2022-01-12 15:57:05 +08:00
    @FaceBug 后续有判断的,是判断如果一维数组$arr 不为空,就变成多维数组,并赋值一个特定的数给它。
    BJL
        4
    BJL  
       2022-01-12 16:00:45 +08:00   ❤️ 2
    $src = ['a','b','c','d'];

    $output_v = "";

    for($i = count($src) - 1;$i >= 0;$i--){
    $v = $src[$i];
    $v_prev = $src[$i + 1] ?? "";
    $output[$v] = $output ?? $output_v;
    unset($output[$v_prev]);
    }
    echo json_encode($output);
    tellmeworld
        5
    tellmeworld  
    OP
       2022-01-12 16:01:55 +08:00
    厉害,我刚想到可能先转化为 json 字符串形式,然后再转换,你已经写好了
    q792602257
        6
    q792602257  
       2022-01-12 16:03:03 +08:00   ❤️ 1
    仅供参考
    ```php
    /**
    * @var string[] 必须是能作为数组键的值
    */
    $arr = array("a", "b", "c", "d", "e");
    $newArr = array();
    // 引用新的数组
    $newArrPointer = &$newArr;
    while (sizeof($arr) > 0) {
    // 移出第一个元素,作为键名
    $key = array_shift($arr);
    // 对上一个引用,做修改操作
    $newArrPointer[$key] = array();
    // 重新引用新的数组
    $newArrPointer = &$newArrPointer[$key];
    }
    // 如果需要赋值,在这里赋值
    $newArrPointer = 777;
    // 释放引用
    unset($newArrPointer);
    print_r($newArr);
    ```
    BJL
        7
    BJL  
       2022-01-12 16:06:12 +08:00
    @tellmeworld 楼上那个比较好
    FaceBug
        8
    FaceBug  
       2022-01-12 16:24:24 +08:00   ❤️ 1
    @tellmeworld 是我理解错了

    不过这和 json 有什么关系
    justrand
        9
    justrand  
       2022-01-12 16:36:35 +08:00
    @tellmeworld 你需要的结果是这样的?
    ~~~php
    array(1) {
    ["a"]=>
    array(1) {
    ["b"]=>
    array(1) {
    ["c"]=>
    array(1) {
    ["d"]=>
    array(1) {
    ["e"]=>
    int(777)
    }
    }
    }
    }
    }
    FaceBug
        10
    FaceBug  
       2022-01-12 16:38:43 +08:00
    $src = ['a', 'b', 'c', 'd'];
    $output = "";
    while (count($src) > 0) {
    $tmp = [];
    $output = $tmp[array_pop($src)] = $output;
    $output = $tmp;
    }
    print_r($output);
    ntuwang
        11
    ntuwang  
       2022-01-13 10:30:27 +08:00
    你头像有政治错误啊,湾湾木了啊
    totoro52
        12
    totoro52  
       2022-01-13 11:48:55 +08:00
    换个头像吧 你这头像肯定是青蛙画的
    houshengzi
        13
    houshengzi  
       2022-01-13 20:25:34 +08:00
    内置函数,array_fill_keys 应该可以满足到
    RickyC
        14
    RickyC  
       2022-01-14 11:00:03 +08:00
    ```
    public function test()
    {
    //原数组
    $arr1 = ['a', 'b', 'c', 'd'];

    //结果数组
    $arr2 = [];

    //初始化指针
    $tmp = &$arr2;

    foreach ($arr1 as $value) {
    //将 value 转化为键
    $tmp[$value] = [];

    //更新指针
    $tmp = &$tmp[$value];
    }

    //查看结果
    echo '<pre>';
    var_dump($arr2);
    }
    ```

    不知道对不对
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1368 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:38 · PVG 01:38 · LAX 10:38 · JFK 13:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.