有很多关于使用点表示法访问PHP数组的技巧和代码示例,但我想做一些相反的事情.我想采取像这样的多维数组:
$myArray = array(
'key1' => 'value1',
'key2' => array(
'subkey' => 'subkeyval'
),
'key3' => 'value3',
'key4' => array(
'subkey4' => array(
'subsubkey4' => 'subsubkeyval4',
'subsubkey5' => 'subsubkeyval5',
),
'subkey5' => 'subkeyval5'
)
);
Run Code Online (Sandbox Code Playgroud)
把它变成这个(可能通过一些递归函数):
$newArray = array(
'key1' => 'value1',
'key2.subkey' => 'subkeyval',
'key3' => 'value3',
'key4.subkey4.subsubkey4' => 'subsubkeyval4',
'key4.subkey5.subsubkey5' => 'subsubkeyval5',
'key4.subkey5' => 'subkeyval5'
);
Run Code Online (Sandbox Code Playgroud)
goa*_*oat 70
代码
$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($myArray));
$result = array();
foreach ($ritit as $leafValue) {
$keys = array();
foreach (range(0, $ritit->getDepth()) as $depth) {
$keys[] = $ritit->getSubIterator($depth)->key();
}
$result[ join('.', $keys) ] = $leafValue;
}
Run Code Online (Sandbox Code Playgroud)
产量
Array
(
[key1] => value1
[key2.subkey] => subkeyval
[key3] => value3
[key4.subkey4.subsubkey4] => subsubkeyval4
[key4.subkey4.subsubkey5] => subsubkeyval5
[key4.subkey5] => subkeyval5
)
Run Code Online (Sandbox Code Playgroud)
演示:http://codepad.org/YiygqxTM
我需要去,但如果你明天需要解释,请问我.
已经有答案了RecursiveIteratorIterator。但这里有一个更优化的解决方案,避免使用嵌套循环:
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($arr),
RecursiveIteratorIterator::SELF_FIRST
);
$path = [];
$flatArray = [];
foreach ($iterator as $key => $value) {
$path[$iterator->getDepth()] = $key;
if (!is_array($value)) {
$flatArray[
implode('.', array_slice($path, 0, $iterator->getDepth() + 1))
] = $value;
}
}
Run Code Online (Sandbox Code Playgroud)
这里有几点需要说明。注意这里常量的使用RecursiveIteratorIterator::SELF_FIRST。这很重要,因为默认的密钥RecursiveIteratorIterator::LEAVES_ONLY不会让我们访问所有密钥。因此,通过这个常量集,我们从数组的顶层开始并深入。这种方法让我们可以存储密钥的历史记录,并在使用丰富的叶子方法时准备密钥RecursiveIteratorIterator::getDepth。
小智 5
这将处理任意级别的嵌套:
<? //PHP 5.4+
$dotFlatten = static function(array $item, $context = '') use (&$dotFlatten){
$retval = [];
foreach($item as $key => $value){
if (\is_array($value) === true){
foreach($dotFlatten($value, "$context$key.") as $iKey => $iValue){
$retval[$iKey] = $iValue;
}
} else {
$retval["$context$key"] = $value;
}
}
return $retval;
};
var_dump(
$dotFlatten(
[
'key1' => 'value1',
'key2' => [
'subkey' => 'subkeyval',
],
'key3' => 'value3',
'key4' => [
'subkey4' => [
'subsubkey4' => 'subsubkeyval4',
'subsubkey5' => 'subsubkeyval5',
],
'subkey5' => 'subkeyval5',
],
]
)
);
?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8924 次 |
| 最近记录: |