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

问题描述 投票:0回答:2

示例输入为 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 ....

});
php arrays laravel recursion multidimensional-array
2个回答
8
投票

您想要做的事情称为将多维数组转换为带有点表示法的数组。

你不需要重新发明轮子,Laravel 已经有一个助手了,叫做 array_dot()

array_dot函数将多维数组展平为 使用“点”表示法表示深度的单级数组:

$array = ['产品' => ['办公桌' => ['价格' => 100]]];

$展平 = array_dot($array);

// ['products.desk.price' => 100]

您只需使用

json_decode()
将 json 转换为数组,然后使用
array_dot()
将其展平即可获得带有点表示法的数组。


0
投票

Laravel 有一个集合方法,可以将多维结构转换为带有点分隔键的扁平结构 --

dot()

代码:(PHPize演示

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

var_export(
    collect(json_decode($json, true))
    ->dot()
    ->toArray()
);

输出:

array (
  'user.name' => 'Thomas',
  'user.age' => 101,
  'shoppingcart.products.p1' => 'someprod',
  'shoppingcart.products.p2' => 'someprod2',
  'shoppingcart.valuta' => 'eur',
  'shoppingcart.coupon' => NULL,
  'shoppingcart.something.0' => 'bla1',
  'shoppingcart.something.1' => 'bla2',
)
© www.soinside.com 2019 - 2024. All rights reserved.