【发布时间】:2018-12-06 10:48:48
【问题描述】:
我有一个这样的 .yaml 文件。
Folder1:
- Hello_.doc
- Folder2:
- Hello__.doc
- World__.pdf
- Folder3:
- Hello__.doc
- Folder4:
- Hello___.doc
- Folder5:
- Hello____.doc
- Folder6:
- Hello____.doc
之后我通过 symfony YAML 解析器解析它,我得到了这个结果。
$data = Array
(
[Folder1] => Array
(
[0] => Hello_.doc
[1] => Array
(
[Folder2] => Array
(
[0] => Hello__.doc
[1] => World__.pdf
)
)
[2] => Array
(
[Folder3] => Array
(
[0] => Hello__.doc
[1] => Array
(
[Folder4] => Array
(
[0] => Hello___.doc
[1] => Array
(
[Folder5] => Array
(
[0] => Hello____.doc
)
)
[2] => Array
(
[Folder6] => Array
(
[0] => Hello____.doc
)
)
)
)
)
)
)
)
但我需要将数组数据转换为如下格式:
Array
(
[Folder1] => Array
(
[0] => Hello_.doc
[Folder2] => Array
(
[0] => Hello__.doc
[1] => World__.pdf
)
[Folder3] => Array
(
[0] => Hello__.doc
[Folder4] => Array
(
[0] => Hello___.doc
[Folder5] => Array
(
[0] => Hello____.doc
)
[Folder6] => Array
(
[0] => Hello____.doc
)
)
)
)
);
我创建了一个这样的函数。
function normalizeData($data) {
foreach ($data as $ky => $row) {
if (is_array($row)) {
foreach ($row as $k => $v) {
if (is_numeric($k) && is_array($v)) {
$key = key($v);
if (! is_numeric($key)) {
$data[$ky][$key] = $v[$key];
unset($data[$ky][$k]);
}
} elseif (is_string($k) && is_array($v)) { // associative
foreach ($v as $kk => $vv) {
if (is_numeric($kk) && is_array($vv)) {
$key_ = key($vv);
if (! is_numeric($key_)) {
$data[$ky][$k][$key_] = $vv[$key_];
unset($data[$ky][$k][$kk]);
}
} elseif (is_string($kk) && is_array($vv)) {
// We need recursive in here..
//
foreach ($vv as $kkk => $vvv) {
if (is_numeric($kkk) && is_array($vvv)) {
$key__ = key($vvv);
if (! is_numeric($key__)) {
$data[$ky][$k][$kk][$key__] = $vvv[$key__];
unset($data[$ky][$k][$kk][$kkk]);
}
} elseif (is_string($kkk) && is_array($vvv)) {
/// recursive
}
}
}
}
}
}
}
}
return $data;
}
但我必须调用此函数 3 次才能标准化数据。
$data = normalizeData($data);
$data = normalizeData($data);
$data = normalizeData($data);
如何创建干净的递归函数?
【问题讨论】:
标签: php symfony yaml associative-array data-manipulation