123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <?php
- namespace Symfony\Component\Translation\Util;
- class ArrayConverter
- {
-
- public static function expandToTree(array $messages)
- {
- $tree = [];
- foreach ($messages as $id => $value) {
- $referenceToElement = &self::getElementByPath($tree, self::getKeyParts($id));
- $referenceToElement = $value;
- unset($referenceToElement);
- }
- return $tree;
- }
- private static function &getElementByPath(array &$tree, array $parts)
- {
- $elem = &$tree;
- $parentOfElem = null;
- foreach ($parts as $i => $part) {
- if (isset($elem[$part]) && \is_string($elem[$part])) {
-
- $elem = &$elem[implode('.', \array_slice($parts, $i))];
- break;
- }
- $parentOfElem = &$elem;
- $elem = &$elem[$part];
- }
- if ($elem && \is_array($elem) && $parentOfElem) {
-
- self::cancelExpand($parentOfElem, $part, $elem);
- }
- return $elem;
- }
- private static function cancelExpand(array &$tree, string $prefix, array $node)
- {
- $prefix .= '.';
- foreach ($node as $id => $value) {
- if (\is_string($value)) {
- $tree[$prefix.$id] = $value;
- } else {
- self::cancelExpand($tree, $prefix.$id, $value);
- }
- }
- }
-
- private static function getKeyParts(string $key): array
- {
- $parts = explode('.', $key);
- $partsCount = \count($parts);
- $result = [];
- $buffer = '';
- foreach ($parts as $index => $part) {
- if (0 === $index && '' === $part) {
- $buffer = '.';
- continue;
- }
- if ($index === $partsCount - 1 && '' === $part) {
- $buffer .= '.';
- $result[] = $buffer;
- continue;
- }
- if (isset($parts[$index + 1]) && '' === $parts[$index + 1]) {
- $buffer .= $part;
- continue;
- }
- if ($buffer) {
- $result[] = $buffer.$part;
- $buffer = '';
- continue;
- }
- $result[] = $part;
- }
- return $result;
- }
- }
|