【问题标题】:Transform dot array to associative array将点数组转换为关联数组
【发布时间】:2019-01-06 11:58:01
【问题描述】:

在 laravel 中,是否有任何函数可以将用点分隔的 string 转换为 associative array

例如:

user.profile.settings 变成['user' => ['profile' => 'settings']] ?

我找到了methodarray_dot,但它的工作方式相反。

【问题讨论】:

    标签: arrays string laravel laravel-5.5


    【解决方案1】:

    Laravel 不提供这样的功能。

    【讨论】:

    • 好吧,我猜它没有被使用。谢谢。
    【解决方案2】:

    不,Laravel 默认只为您提供 array_dot() 帮助器,您可以使用它来将多维数组扁平化为点符号数组。

    可能的解决方案

    最简单的方法是使用 this 小包,将 array_undot() 助手添加到你的 Laravel,然后就像包文档说的那样,你可以这样做:

    $dotNotationArray = ['products.desk.price' => 100, 
                         'products.desk.name' => 'Oak Desk',
                         'products.lamp.price' => 15,
                         'products.lamp.name' => 'Red Lamp'];
    
    $expanded = array_undot($dotNotationArray)
    
    /* print_r of $expanded:
    
    [
        'products' => [
            'desk' => [
                'price' => 100,
                'name' => 'Oak Desk'
            ],
            'lamp' => [
                'price' => 15,
                'name' => 'Red Lamp'
            ]
        ]
    ]
    */
    

    另一个可能的解决方案是使用以下代码创建一个辅助函数:

    function array_undot($dottedArray) {
      $array = array();
      foreach ($dottedArray as $key => $value) {
        array_set($array, $key, $value);
      }
      return $array;
    }
    

    【讨论】:

    • 哦,没想到这样的东西有一整套,但看起来不错。谢谢你:)
    • 不幸的是他们没有数组,他们只有一个字符串,它是一个键和值
    • @lagbox 哦,没注意到,它是一个普通的点关联数组。 ://
    • 是的,否则array_dot 的反面会很棒.. 有点希望他们的例子不正确,但是... :)
    【解决方案3】:

    array_dot 的反面并不完全符合您的要求,因为它仍然需要一个关联数组并返回一个关联数组,而您只有一个字符串。

    我想你可以很容易地做到这一点。

    function yourThing($string)
    {
        $pieces = explode('.', $string);
        $value = array_pop($pieces);
        array_set($array, implode('.', $pieces), $value);
        return $array;
    }
    

    这假设您传递的字符串至少包含一个点(至少一个键 [在最后一个点之前] 和一个值 [在最后一个点之后])。您可以将其扩展为与字符串数组一起使用并轻松添加适当的检查。

    >>> yourThing('user.profile.settings')
    => [
         "user" => [
           "profile" => "settings",
         ],
       ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-11
      • 2017-01-10
      • 2011-05-08
      • 2020-04-23
      • 2016-08-07
      • 2020-07-17
      • 1970-01-01
      相关资源
      最近更新 更多