在 Symfony2 中将多维数组转换为点表示法

Posted

技术标签:

【中文标题】在 Symfony2 中将多维数组转换为点表示法【英文标题】:Convert multidimensional array to dot notation in Symfony2 【发布时间】:2017-04-05 01:03:42 【问题描述】:

Symfony 将嵌套的 YAML 和 php 数组转换文件转换为点符号,如下所示:modules.module.title

我正在编写一些将 YAML 翻译文件导出到数据库的代码,我需要将解析后的文件展平为点符号。

有谁知道 Symfony 使用哪个函数将嵌套数组展平为点表示法?

我在源代码的任何地方都找不到它。

【问题讨论】:

【参考方案1】:

就是Symfony\Component\Translation\Loader\ArrayLoader中的flatten()方法:

<?php

/**
 * Flattens an nested array of translations.
 *
 * The scheme used is:
 *   'key' => array('key2' => array('key3' => 'value'))
 * Becomes:
 *   'key.key2.key3' => 'value'
 *
 * This function takes an array by reference and will modify it
 *
 * @param array  &$messages The array that will be flattened
 * @param array  $subnode   Current subnode being parsed, used internally for recursive calls
 * @param string $path      Current path being parsed, used internally for recursive calls
 */
private function flatten(array &$messages, array $subnode = null, $path = null)

    if (null === $subnode) 
        $subnode = &$messages;
    
    foreach ($subnode as $key => $value) 
        if (is_array($value)) 
            $nodePath = $path ? $path.'.'.$key : $key;
            $this->flatten($messages, $value, $nodePath);
            if (null === $path) 
                unset($messages[$key]);
            
         elseif (null !== $path) 
            $messages[$path.'.'.$key] = $value;
        
    

【讨论】:

【参考方案2】:

我不知道以前的 Symfony 版本是怎么写的,但在 Symfony 4.2 及以后的版本中,返回的翻译已经变平了。

返回messages 目录翻译的示例控制器。就我而言,我使用此响应来提供 i18next js 库。

<?php

declare(strict_types=1);

namespace Conferences\Controller;

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;
use Symfony\Component\Translation\TranslatorBagInterface;
use Symfony\Contracts\Translation\TranslatorInterface;

final class TranslationsController

    public function __invoke(TranslatorInterface $translator): JsonResponse
    
        if (!$translator instanceof TranslatorBagInterface) 
            throw new ServiceUnavailableHttpException();
        

        return new JsonResponse($translator->getCatalogue()->all()['messages']);
    

路线定义:

translations:
  path: /_locale/translations
  controller: App\Controller\TranslationsController
  requirements: _locale: pl|en

【讨论】:

以上是关于在 Symfony2 中将多维数组转换为点表示法的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中将多维数组转换为 XML 对象 [重复]

在php中将一维数组转换为多维数组[重复]

在 C 中将多维数组作为参数传递

请教网络高手们,windows驱动中将网络字节序转换为点分十进制数串的函数叫啥名字?

在 PHP 中将多维关联数组展平为一维引用数组

在c ++中将多维数组初始化为类成员