Слияние веток для JSON со строкой чисел в качестве ключа - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь объединить хэши с Twig для вывода JSON.

Моя проблема в том, что некоторые из моих ключей используют строки чисел, а веточка преобразует их в целые числа.

Мой код:

{% set rows = {} %}
{% for key, val in row %}
    {% set rows = rows|merge({ (key) : val }) %}
{% endfor %}
{{ { 'report': { 'metric': metric, 'rows': rows, 'tot': tot, 'min': min, 'max': max } }|json_encode|raw }}

Какие выходы

{"report":{"metric":"sessions","rows":["5","4","4","3","7","4","4"],"tot":"31","min":"0","max":"7"}}

Я также попытался заменить мои ключи на number_format, но, поскольку я удаляю все нечисловые символы, вывод такой же.

{% set rows = {} %}
{% for key, val in row %}
    {% set rows = rows|merge({ (key)|number_format(0,'','') : val }) %}
{% endfor %}
{{ { 'report': { 'metric': metric, 'rows': rows, 'tot': tot, 'min': min, 'max': max } }|json_encode|raw }}

Ожидаемый результат выглядит следующим образом:

{"report":{"metric":"sessions","rows":{"20180423":"5","20180424":"4","20180425":"4","20180426":"3","20180427":"7","20180428":"4","20180429":"4"},"tot":"31","min":"0","max":"7"}}

Можно ли как-нибудь помешать Твигу изменить мои ключи на целые?

Нашел этот пост, но он не работает для меня, так как мои ключи - это цепочки цифр. значение ключа заменяется на «ключ» при использовании merge () в ветке

1 Ответ

0 голосов
/ 29 апреля 2018
Фильтр

Twig merge использует PHP-функцию array_merge, а документ сообщает:

Значения во входном массиве с цифровыми клавишами будут перенумерованы с инкрементные ключи, начинающиеся с нуля в массиве результатов.

И строка, содержащая только цифры, считается числовой.

Решение:

Самое простое решение - изменить формат клавиш с "20180423" на "2018-04-23", что сделает его не числовым.


Если вам действительно нужно сохранить ваши цифровые клавиши, вы можете создать собственный фильтр , чтобы объединить массивы так, как вы хотите:

namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class AppExtension extends AbstractExtension
{
    public function getFilters()
    {
        return array(
            new TwigFilter('mymerge', array($this, 'merge')),
        );
    }

    public function merge($baseArray, $arrayToMerge)
    {
        foreach ($arrayToMerge as $key => $value) {
            $baseArray[$key] = $value;
        }

        return $baseArray;
    }
}

Тогда

{% set test = {"1234": "2", "2345": "3"} %}
{% set rows = {"test": "1"} %}
{% set rows = rows|mymerge(test) %}
{{ { 'report': { 'rows': rows } }|json_encode|raw }}

Будет выводить

{ "Отчет": { "строк": { "тест": "1", "1234": "2", "2345": "3"}}} * * одна тысяча тридцать-одна

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...