【发布时间】:2019-01-05 11:24:18
【问题描述】:
我从一个任意深度的嵌套数组开始。在该数组中,一些键是一系列由点分隔的标记。例如“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 上的类似问题不同,因为这种数组和非数组的混合用于扩展。从概念上讲,它是一个嵌套数组,其中 any 级别的声音 groups 元素需要替换为新数组,因此这里发生了两个级别的递归:树行走,和扩展,然后遍历扩展的树,看看是否需要更多的扩展。
【问题讨论】:
-
我们能保证最多一个
.还是我们会看到foo.bar.baz?如果是后者,应该如何处理——作为bar的baz子或兄弟? -
@NigelRen 子结构分散在现有的嵌套数组中,因此这是关于扩展数组中的节点,而不是从头开始构建数组元素的机制。答案是最有启发性的,提供的解决方案以一种新的方式解决了我的问题。
标签: php arrays recursion adyen