如何将 symfony yaml 解析器输出转换为完全关联格式?
How can i convert symfony yaml parser output to completely associative format?
我有一个这样的 .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;
}
但是我必须调用这个函数三次来规范化数据。
$data = normalizeData($data);
$data = normalizeData($data);
$data = normalizeData($data);
如何创建干净的递归函数?
Spyc会输出数组结构,你要找的。
PHP:
include('spyc.php');
$yaml =
'Folder1:
Hello_.doc
Folder2:
Hello__.doc
World__.pdf
Folder3:
Hello__.doc
Folder4:
Hello___.doc
Folder5:
Hello____.doc
Folder6:
Hello____.doc';
$array = spyc_load($yaml);
print_r($array);
输出:
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
)
)
)
)
)
我有一个这样的 .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;
}
但是我必须调用这个函数三次来规范化数据。
$data = normalizeData($data);
$data = normalizeData($data);
$data = normalizeData($data);
如何创建干净的递归函数?
Spyc会输出数组结构,你要找的。
PHP:
include('spyc.php');
$yaml =
'Folder1:
Hello_.doc
Folder2:
Hello__.doc
World__.pdf
Folder3:
Hello__.doc
Folder4:
Hello___.doc
Folder5:
Hello____.doc
Folder6:
Hello____.doc';
$array = spyc_load($yaml);
print_r($array);
输出:
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
)
)
)
)
)