有很多使用点表示法访问PHP数组的技巧和代码示例,但我想做一些相反的事情。我想采取这样的多维数组:
$myArray = array(
'key1' => 'value1',
'key2' => array(
'subkey' => 'subkeyval'
),
'key3' => 'value3',
'key4' => array(
'subkey4' => array(
'subsubkey4' => 'subsubkeyval4',
'subsubkey5' => 'subsubkeyval5',
),
'subkey5' => 'subkeyval5'
)
);
并将其转换为这样(可能通过一些递归函数):
$newArray = array(
'key1' => 'value1',
'key2.subkey' => 'subkeyval',
'key3' => 'value3',
'key4.subkey4.subsubkey4' => 'subsubkeyval4',
'key4.subkey5.subsubkey5' => 'subsubkeyval5',
'key4.subkey5' => 'subkeyval5'
);
5条答案
按热度按时间u2nhd7ah1#
德赫法典
输出
演示:http://codepad.org/YiygqxTM
我得走了,但如果你明天需要解释,问我。
ovfsdjhp2#
这将处理任意级别的嵌套:
0x6upsns3#
RecursiveIteratorIterator
已经有了答案。但这里有一个更优化的解决方案,避免使用嵌套循环:这里有几点需要说明。注意这里使用了
RecursiveIteratorIterator::SELF_FIRST
常量。这很重要,因为默认值是RecursiveIteratorIterator::LEAVES_ONLY
,它不允许我们访问所有的键。因此,设置了这个常量,我们从数组的顶层开始,深入研究。这种方法可以让我们存储键的历史,并在使用RecursiveIteratorIterator::getDepth
方法丰富叶子时准备键。Here is a working demo.
3b6akqbq4#
这是我对递归解决方案的看法,它适用于任何深度的数组:
可以称为
$newArray = convertArray($myArray)
。brgchamk5#
这是另一种类似于上面的Blafrat的方法-但只是将数组作为值处理。
(The唯一不能捕捉的情况是,你有一个关联值,但第一个键是0。
请注意,RecursiveIteratorIterator可能比常规递归函数慢。https://xenforo.com/community/threads/php-spl-why-is-recursiveiteratoriterator-100x-slower-than-recursive-search.57572/
在这个例子中,使用了php5.6中给出的1000次迭代的示例数组,这段代码的速度是原来的两倍(recursive=.032 vs interator=.062)-但是在大多数情况下,这一差异可能是微不足道的。主要是我更喜欢递归,因为我发现迭代器的逻辑对于这样一个简单的用例来说不必要的复杂。