我从一个任意深度的嵌套数组开始。在该数组中,一些键是一系列由点分隔的标记。例如“billingAddress.street”或“foo.bar.baz”。我想将这些键元素扩展为数组,因此结果是一个嵌套数组,所有这些键都展开了。
例如:
[
'billingAddress.street' => 'My Street',
'foo.bar.baz' => 'biz',
]
应扩展为:
[
'billingAddress' => [
'street' => 'My Street',
],
'foo' => [
'bar' => [
'baz' => 'biz',
]
]
]
原始的“billingAddress.street”可以留在新的“billingAddress”数组旁边,但不是必须的(因此解决方案可以对原始数组进行操作或创建新数组)。可能需要将其他元素(例如“billingAddress.city”)添加到数组的同一扩展部分。
一些键可能有两个以上由点分隔的标记,因此需要更深入地扩展。
我看过array_walk_recursive()
但只对元素起作用。对于每个匹配的元素键,我实际上想修改这些元素所在的父数组。
我看过array_map
,但它不提供对密钥的访问,而且据我所知不是递归的。
要扩展的示例数组:
[
'name' => 'Name',
'address.city' => 'City',
'address.street' => 'Street',
'card' => [
'type' => 'visa',
'details.last4' => '1234',
],
]
这将扩展为:
[
'name' => 'Name',
'address.city' => 'City', // Optional
'address' => [
'city' => 'City',
'street' => 'Street',
],
'address.street' => 'Street', // Optional
'card' => [
'type' => 'visa',
'details.last4' => '1234', // Optional
'details' => [
'last4' => '1234',
],
],
]
我认为我需要的是遍历array
嵌套数组中的每个并且可以对其应用用户函数的东西。但我确实怀疑我遗漏了一些明显的东西。我正在使用的支付网关使用点符号向我发送这种数组和“假装数组”的组合,我的目标是将其规范化为一个数组以提取部分。
我相信这个问题与 SO 上的类似问题不同,因为这种数组和非数组的混合用于扩展。从概念上讲,它是一个嵌套数组,其中任何级别的合理元素组都需要用新数组替换,因此这里发生了两个级别的递归:树行走,扩展,然后扩展树的行走以查看如果需要更多的扩展。