Разбор массива Twig и проверка по ключу - PullRequest
2 голосов
/ 17 октября 2019

Я пытаюсь увидеть, есть ли у массива ключ. В первом случае возвращаются 2 результата 1-5 и, в то время как второй, кажется, работает нормально.

Есть идеи, почему это происходит?

{% set options = {'1' : '1' , '1-5' : '5' , '1-12' : '12' } %}
{% set selected = '1-5' %}

Wrong check
{% for k,v in options %}
    {% if k == selected %}    
        {{ k }}
    {% endif %}    
{% endfor %}


Right
{% for k,v in options %}    
    {% if k|format == selected|format %}    
        {{ k }}
    {% endif %}        
{% endfor %}

https://twigfiddle.com/c6m0h4

1 Ответ

2 голосов
/ 17 октября 2019

Twig скомпилирует «неправильную проверку» в следующем фрагменте PHP:

if (($context["k"] == (isset($context["selected"]) || array_key_exists("selected", $context) ? $context["selected"] : (function () { throw new RuntimeError('Variable "selected" does not exist.', 6, $this->source); })()))) {

Упрощенно это становится

if ($context["k"] == $context["selected"])

Поскольку тип context["k"] (для первой итерации) является целым числом, PHP также приведёт правую часть уравнения к целому числу. Таким образом, уравнение фактически становится следующим:

if ((int)1 == (int)'1-5') 

, и приведение 1-5 к целому числу становится 1, в результате чего окончательное уравнение будет иметь вид:

1 == 1, что соответствует true


Вы можете проверить тот факт, что первый ключ обрабатывается как целое число с помощью следующего фрагмента PHP:

<?php

$foo = [ '1' => 'bar', ];
$bar = '1-5';

foreach($foo as $key => $value) {
    var_dump($key); ## output: (int) 1
    var_dump($key == $bar); ## output: true
}

demo

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