如何在 Laravel 的宏中将多维集合(数组)扁平化为点表示法版本?

5

JSON格式的示例输入

{
   "user":{
      "name":"Thomas",
      "age":101
   },
   "shoppingcart":{
      "products":{
         "p1":"someprod",
         "p2":"someprod2"
      },
      "valuta":"eur",
      "coupon":null,
      "something":[
         "bla1",
         "bla2"
      ]
   }
}

期望输出结果

[
    'user.name' => 'Thomas',
    'user.age' => 101,
    'shoppingcart.products.p1' => 'someprod',
    ...
    'shoppingcart.something.1' => 'bla1'
]

我写了这个函数,但它输出的结果是错误的。此外,我想把这个函数重写成Collection的宏,但我无法理解它。问题还在于当前的函数需要一个全局变量来跟踪结果。

public function dotFlattenArray($array, $currentKeyArray = []) {

        foreach ($array as $key => $value) {
            $explodedKey = preg_split('/[^a-zA-Z]/', $key);
            $currentKeyArray[] = end($explodedKey);
            if (is_array($value)) {
                $this->dotFlattenArray($value, $currentKeyArray);
            } else {
                $resultArray[implode('.', $currentKeyArray)] = $value;
                array_pop($currentKeyArray);
            }
        }
        $this->resultArray += $resultArray;
    }

我的问题有两个: 1. 有时函数不能给出正确的结果 2. 我该如何将这个递归函数改写成宏

Collection::macro('dotflatten', function () {
    return ....

});

1
你有没有查看SO上已有的答案?https://dev59.com/VGkw5IYBdhLWcg3w8fBJ和链接的问题。 - Jonas Staudenmeir
1个回答

8
你正在尝试做的事情被称为将多维数组转换为点表示法数组。
您无需重新发明轮子,Laravel已经有了一个名为array_dot()的帮助程序。
引用块中的array_dot函数将多维数组展平为单层数组,并使用“点”表示法指示深度: $array = ['products' => ['desk' => ['price' => 100]]]; $flattened = array_dot($array); // ['products.desk.price' => 100]
您只需要使用json_decode()将json转换为数组,然后使用array_dot()将其展平,即可获得点表示法数组。

有没有办法像集合 flatten() 方法一样传递一个 depth 值?在我的用例中,我的多维数组具有恒定的深度,但我需要将其展平到倒数第二层。 - fudo
还可以使用 Arr::dot() 助手函数。 - Jason

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