在 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 中将多维数组转换为点表示法的主要内容,如果未能解决你的问题,请参考以下文章