关联数组索引的PHP类型检查不是字符串,应该是这样

时间:2013-06-27 22:13:36

标签: php type-conversion associative-array

我在这里遇到了一个问题。

$arr = array ('1' => 'one');
var_dump(current(array_keys($arr)));
   // prints: int(1)
   // should print: string(1) "1"

我正在尝试创建一个关联数组,但PHP正在将我的字符串转换为整数。

我正在为一系列< input type =“radio”>生成标记。按钮,并将checked属性应用于其值与POST请求中的值匹配的属性,例如

$selected = isset($_POST[$this->name]) ? $_POST[$this->name] : null;
foreach ($this->options as $value => $label) {
   $html .= "<input type=\"radio\" name=\"{$this->name}\" value=\"$value\"".
            ($_POST[$this->name] === $value ? ' checked' : '').'>';
}

我可以使用两个相同的符号而不是类型比较;但是,如果数组是:

$this->options = array (
   '0' => 'No',
   '1' => 'Yes'
);

即使没有设置POST值,它也会选择0选项。但是,它不应该选择任何单选按钮,因为它们都没有值为null。

编辑:刚刚发现:“包含有效整数的字符串将被转换为整数类型。例如,键”8“实际上将存储在8下。另一方面,”08“将不要被强制转换,因为它不是有效的十进制整数。“在PHP手册中。认为无论如何都要绕过它?

2 个答案:

答案 0 :(得分:0)

正如@ Twisted1919所说,显而易见的解决方案是在支票中进行类型转换。

$selected = isset($_POST[$this->name]) ? $_POST[$this->name] : null;
foreach ($this->options as $value => $label) {
   $html .= "<input type=\"radio\" name=\"{$this->name}\" value=\"$value\"".
            ($selected === (string) $value ? ' checked' : '').'>';
}

谢谢!

答案 1 :(得分:0)

这是不可能的。

来自Manual

A key may be either an integer or a string. If a key is the standard representation
of an integer, it will be interpreted as such (i.e. "8" will be interpreted as 8, 
while "08" will be interpreted as "08").