У меня есть файл .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);
Как я могу создать чистую рекурсивную функцию?
Задача ещё не решена.
Других решений пока нет …