有谁知道为什么 Symfony ChoiceType 选择列表将标签保留为数组键而不是值?
Does anyone know why Symfony ChoiceType choices list keep labels as the array keys rather than values?
有谁知道为什么 Symfony ChoiceType 选择列表将标签作为数组键而不是值?
我看了看,但无法找到该决定背后的原因。由于选项标签可能包含很多特殊字符并且相当长,而在大多数情况下,选择值是一个 int 或用于枚举类型的小字符串。
这背后的原因与 PHP 如何处理某些值(如 null
和布尔值作为数组键)有关。这将导致不一致的行为:
php > $a = [true => 'Yes', false => 'No', null => 'Empty'];
php > var_dump($a);
array(3) {
[1]=>
string(3) "Yes"
[0]=>
string(2) "No"
[""]=>
string(8) "Empty"
}
php > $a = [false => 'Empty', 0 => 'No', 1 => 'Yes', 2 => 'Maybe'];
php > var_dump($a);
array(3) {
[0]=>
string(2) "No"
[1]=>
string(3) "Yes"
[2]=>
string(5) "Maybe"
}
正如您在第二个示例中看到的那样,这甚至会导致密钥被意外覆盖。为了避免这些问题,Symfony 决定将 value/label-mapping 反转为 label/value,因为标签几乎总是字符串,因此可以比值更可靠地处理。
如果您 运行 遇到长标签名称的问题,您可以使用翻译组件扩展到长版本的短翻译键。
有谁知道为什么 Symfony ChoiceType 选择列表将标签作为数组键而不是值?
我看了看,但无法找到该决定背后的原因。由于选项标签可能包含很多特殊字符并且相当长,而在大多数情况下,选择值是一个 int 或用于枚举类型的小字符串。
这背后的原因与 PHP 如何处理某些值(如 null
和布尔值作为数组键)有关。这将导致不一致的行为:
php > $a = [true => 'Yes', false => 'No', null => 'Empty'];
php > var_dump($a);
array(3) {
[1]=>
string(3) "Yes"
[0]=>
string(2) "No"
[""]=>
string(8) "Empty"
}
php > $a = [false => 'Empty', 0 => 'No', 1 => 'Yes', 2 => 'Maybe'];
php > var_dump($a);
array(3) {
[0]=>
string(2) "No"
[1]=>
string(3) "Yes"
[2]=>
string(5) "Maybe"
}
正如您在第二个示例中看到的那样,这甚至会导致密钥被意外覆盖。为了避免这些问题,Symfony 决定将 value/label-mapping 反转为 label/value,因为标签几乎总是字符串,因此可以比值更可靠地处理。
如果您 运行 遇到长标签名称的问题,您可以使用翻译组件扩展到长版本的短翻译键。