为什么在三元上下文中使用时,我的变量没有被赋予正确的值?

时间:2012-11-30 18:19:54

标签: php variable-assignment ternary-operator

我很困惑为什么这段代码:

$mapped_class = ( $mapped_field_index = array_search( $field_name, $automapped_header ) !== false ) ? " mapped mapped_to-" . $mapped_field_index : "";

...始终将1作为$mapped_field_index(适用时)

返回

然而,扩展代码:

$mapped_field_index = array_search( $field_name, $automapped_header );
$mapped_class = $mapped_field_index !== false ? " mapped mapped_to-" . $mapped_field_index : "";

...将正确的搜索索引显示为$mapped_field_index

我认为在PHP中,IF上下文中的赋值也被计算为表达式并返回指定的值。这似乎在这两个示例中都适用,因为$mapped_classarray_search()没有结果的情况下是空白的。

但在两种情况下,我都希望$mapped_field_index包含正确的array_search()索引,而不是三元形式的1(这似乎表示TRUE而不是实际指数)。

三元运算符在这里有贡献吗?

2 个答案:

答案 0 :(得分:1)

在这两种情况下,

$mapped_field_index未设置为相同的值。在第一个示例中,$mapped_field_index等于

的结果

array_search( $field_name, $automapped_header ) !== false

在第二个例子中,它相当于

array_search( $field_name, $automapped_header )

如果您修改第二个示例,则第一行显示为:

$mapped_field_index = array_search( $field_name, $automapped_header ) !== false;

然后你也会在这种情况下得到1。

在这样一个没有效率差异的情况下,你最好使用wordier,但语法更可读。

答案 1 :(得分:0)

比较运算符的优先级高于赋值。见http://php.net/manual/en/language.operators.precedence.php

(你的= =子句在=子句之前被分组)

尝试添加这样的括号(不是100%确定它会起作用,但可能会这样)

$mapped_class = ( ($mapped_field_index = array_search( $field_name, $automapped_header )) !== false ) ? " mapped mapped_to-" . $mapped_field_index : "";