将点数组转换为关联数组

3
在laravel中,是否有一种函数可以将用点分隔的字符串转换为关联数组?
例如:
user.profile.settings转换为['user' => ['profile' => 'settings']]
我找到了array_dot方法,但它是反向工作的。
4个回答

3

不,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;
}

哦,没想到这个小东西有一个完整的包装,但看起来很不错。谢谢 :) - undefined
1
很不幸,它们没有数组,而是有一个单一的字符串,该字符串同时充当键和值。 - undefined
@lagbox哦,没注意到,以为它是一个普通的关联数组。:/ - undefined
是的,否则array_dot的反向操作会很棒...有点希望他们的示例不正确,但是... :) - undefined

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",
     ],
   ]

2

Laravel有一个数组undot方法。

use Illuminate\Support\Arr;
 
$array = [
    'user.name' => 'Kevin Malone',
    'user.occupation' => 'Accountant',
];
 
$array = Arr::undot($array);
 
// ['user' => ['name' => 'Kevin Malone', 'occupation' => 'Accountant']]

参考:https://laravel.com/docs/8.x/helpers#method-array-undot

这个链接介绍了 Laravel 框架中的 array_undot() 方法,该方法将多维数组转换为一维数组。使用该方法可以方便地从多维数组中获取数据,而不需要手动遍历数组。

-1
Laravel没有提供类似的功能。

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