Php 细枝解析数组并按键检查

Php 细枝解析数组并按键检查,php,twig,Php,Twig,我想看看数组是否有键。第一种情况返回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 %} {% e

我想看看数组是否有键。第一种情况返回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 %}
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
}