【问题标题】:Convert an array to multidimensional array将数组转换为多维数组
【发布时间】:2018-02-24 23:24:31
【问题描述】:

我有一个看起来像这样的数组:

array:2 [
    "test1_test2_test3" => "result"
    "category_slug" => "the_slug"
]

我需要做的是把它转换成一个看起来像这样的多维数组:

array:2 [
    "test1" => [
        "test2" => [
            "test3" => "result"
        ]
    ]
    "category" => [
        "slug" => "the_slug"
    ]
]

我知道我可以通过explode 获取一个数组,但我不确定如何从这个开始得到最终结果。

EDIT 数组最初看起来像这样,因为它是从请求参数中提取的:http://url.com?test1.test2.test3=result&category.slug=the_slug 并且 Laravel 会自动将其转换为数组。

【问题讨论】:

标签: php arrays multidimensional-array


【解决方案1】:

一个简单的解决方案:

$result = [];
foreach ($array as $key => $value) {
    foreach (array_reverse(explode('_', $key)) as $key_part) {
        $value = [$key_part => $value];
    }
    $result += $value;
}

如果您需要处理具有相同部分的多个键(例如test1_test2_test3test1_test2_test4),请将最后一行替换为:

$result = array_merge_recursive($result, $value);

【讨论】:

    【解决方案2】:

    我的方法是反转数组,然后遍历键并嵌套它们。

    下面的代码应该可以解决问题。

    $array = [
        "test1_test2_test3" => "result",
        "category_slug" => "the_slug"
    ];
    
    $array = array_map(function ($key, $value) {
        $keys = array_reverse(explode('_', $key));
        while($key = array_shift($keys)) {
            $value = [$key => $value];
        }
    
        return $value;
    }, array_keys($array), $array);
    
    $array = call_user_func_array('array_merge', $array);
    var_dump($array);
    
    /**
    array(2) {
        ["test1"]=>
        array(1) {
            ["test2"]=>
            array(1) {
                ["test3"]=>
                string(6) "result"
            }
        }
        ["category"]=>
        array(1) {
            ["slug"]=>
            string(8) "the_slug"
        }
    }
    */
    

    【讨论】:

      【解决方案3】:

      一种方法:

      $arr = array("test1_test2_test3" => "result", "category_slug" => "the_slug");
      $res = array();
      
      foreach($arr as $k=>$v) {
      
              $t = explode("_", $k);
              $new_arr = array();
              $tmp = $v; 
              for($i=count($t)-1; $i > 0; $i--) {
                      $new_arr[$t[$i]] = $tmp;
                      $tmp = $new_arr;
                      $new_arr = array();
              }
      
              $res[$t[0]] = $tmp;
      
      }
      
      print_r($res);
      

      结果:

      Array
      (
          [test1] => Array
              (
                  [test2] => Array
                      (
                          [test3] => result
                      )
      
              )
      
          [category] => Array
              (
                  [slug] => the_slug
              )
      
      )
      

      【讨论】:

        【解决方案4】:

        查看 Laravel 文档,我找到了一个助手 array_set,这意味着为了将键更改为多维数组,我可以将键更改为使用点符号 str_replace,然后使用助手将其转换为:

        $array = [
            "test1_test2_test3" => "result"
            "category_slug" => "the_slug"
        ]
        
        $new_array = []
        
        foreach($array as $key => $value)
        {
            $key = str_replace('_', '.', $key);
            array_set($new_array, $key, $value);
        }
        

        结果:

        array:2 [
            "test1" => [
                "test2" => [
                    "test3" => "result"
                ]
            ]
            "category" => [
                "slug" => "the_slug"
            ]
        ]
        

        【讨论】:

          猜你喜欢
          • 2023-03-26
          • 2019-06-29
          • 1970-01-01
          • 1970-01-01
          • 2015-11-17
          • 2011-12-09
          相关资源
          最近更新 更多