在PHP中作为数组键的数字string

是否有可能使用数字string如"123"作为一个PHP数组中的键,而不被转换为整数?

 $blah = array('123' => 1); var_dump($blah); 

版画

 array(1) { [123]=> int(1) } 

我想要

 array(1) { ["123"]=> int(1) } 

没有; 不,这不对:

从手册 :

一个键可以是一个整数或一个string。 如果一个键是一个整数的标准表示,它将被解释为这样(即“8”将被解释为8,而“08”将被解释为“08”)。

附录

由于下面的评论,我认为这将是有趣的,指出行为是相似的,但不相同的JavaScript对象键。

 foo = { '10' : 'bar' }; foo['10']; // "bar" foo[10]; // "bar" foo[012]; // "bar" foo['012']; // undefined! 

是的,通过对stdClass对象进行数组转换是可能的:

 $data = new stdClass; $data->{"12"} = 37; $data = (array) $data; var_dump( $data ); 

这给了你(最高到PHP版本7.1):

 array(1) { ["12"]=> int(37) } 

(更新:我原来的答案显示使用json_decode()json_encode()这是不必要的更复杂的方式。

注意注释 :不幸的是不能直接引用这个值: $data['12']将会产生一个通知。

更新
从PHP 7.2开始,也可以使用数字string作为引用该值的键:

 var_dump( $data['12'] ); // int 32 

如果你需要在一个PHP数据结构中使用数字键,一个对象将工作。 对象保存顺序,所以你可以迭代。

 $obj = new stdClass(); $key = '3'; $obj->$key = 'abc'; 

我的解决方法是:

 $id = 55; $array = array( " $id" => $value ); 

空间字符(前置)是一个很好的解决scheme,因为保持int转换:

 foreach( $array as $key => $value ) { echo $key; } 

你会看到55为int。

您可以将键转换为string,但由于PHP的宽松input,它最终会转换为整数。 你自己看:

 $x=array((string)123=>'abc'); var_dump($x); $x[123]='def'; var_dump($x); 

从PHP手册:

一个键可以是一个整数或一个string。 如果一个键是一个整数的标准表示,它将被解释为这样(即“8”将被解释为8,而“08”将被解释为“08”)。 浮点键被截断为整数。 索引和关联数组types在PHP中是相同的types,它们都可以包含整数和string索引。

包含有效整数的string将被转换为整数types。 例如,键“8”实际上将被存储在8以下。另一方面,“08”不会被投射,因为它不是有效的十进制整数。

错误

我有一个连续处理关联数组的铸造函数,

 $array_assoc = cast($arr,'array_assoc'); $array_sequential = cast($arr,'array_sequential'); $obj = cast($arr,'object'); $json = cast($arr,'json'); function cast($var, $type){ $orig_type = gettype($var); if($orig_type == 'string'){ if($type == 'object'){ $temp = json_decode($var); } else if($type == 'array'){ $temp = json_decode($var, true); } if(isset($temp) && json_last_error() == JSON_ERROR_NONE){ return $temp; } } if(@settype($var, $type)){ return $var; } switch( $orig_type ) { case 'array' : if($type == 'array_assoc'){ $obj = new stdClass; foreach($var as $key => $value){ $obj->{$key} = $value; } return (array) $obj; } else if($type == 'array_sequential'){ return array_values($var); } else if($type == 'json'){ return json_encode($var); } break; } return null; // or trigger_error } 

我遇到了这个问题上的数组与'0'和''作为关键。 这意味着我无法检查我的数组键==或===。

 $array=array(''=>'empty', '0'=>'zero', '1'=>'one'); echo "Test 1\n"; foreach ($array as $key=>$value) { if ($key == '') { // Error - wrongly finds '0' as well echo "$value\n"; } } echo "Test 2\n"; foreach ($array as $key=>$value) { if ($key === '0') { // Error - doesn't find '0' echo "$value\n"; } } 

解决方法是在使用之前将数组键还原到string。

 echo "Test 3\n"; foreach ($array as $key=>$value) { if ((string)$key == '') { // Cast back to string - fixes problem echo "$value\n"; } } echo "Test 4\n"; foreach ($array as $key=>$value) { if ((string)$key === '0') { // Cast back to string - fixes problem echo "$value\n"; } } 

我有这个问题试图合并具有string和整数键的数组。 因为这些input字段的名称(如鞋号等),因此整数也可以作为string处理,这一点很重要。

当我使用$data = array_merge($data, $extra); PHP将“重新sorting”密钥。 在尝试做的顺序,整数键(我试图用6'6'"6"甚至(string)"6"作为键)被重命名从0到n …如果你仔细想想,在大多数情况下,这将是所需的行为。

你可以通过使用$data = $data + $extra;来解决这个问题$data = $data + $extra; 代替。 很简单,但我一开始没有想到它^^。

关于@david解决scheme,请注意当您尝试访问关联数组中的string值时,数字将不起作用。 我的猜测是,他们被转移到幕后的整数(当访问数组)时,没有find值。 作为整数访问值也将无法正常工作。 但是你可以使用array_shift()来获取值或迭代数组。

 $data = new stdClass; $data->{"0"} = "Zero"; $data->{"1"} = "One"; $data->{"A"} = "A"; $data->{"B"} = "B"; $data = (array)$data; var_dump($data); /* Note the key "0" is correctly saved as a string: array(3) { ["0"]=> string(4) "Zero" ["A"]=> string(1) "A" ["B"]=> string(1) "B" } */ //Now let's access the associative array via the values //given from var_dump() above: var_dump($data["0"]); // NULL -> Expected string(1) "0" var_dump($data[0]); // NULL (as expected) var_dump($data["1"]); // NULL -> Expected string(1) "1" var_dump($data[1]); // NULL (as expected) var_dump($data["A"]); // string(1) "A" (as expected) var_dump($data["B"]); // string(1) "B" (as expected) 

我有这个问题,而试图sorting我需要sorting键是一个hexsha1的数组。 当生成的sha1值没有字母时,PHP将该键变成一个整数。 但是我需要按照string的相对顺序对数组进行sorting。 所以我需要find一种方法来强制键是一个string,而不会改变sorting顺序。

看看ASCII图表( https://en.wikipedia.org/wiki/ASCII ),感叹号的分类与空格大致相同,肯定比所有的数字和字母都要低。

所以我在关键string的末尾附加了一个感叹号。

 for(...) { $database[$sha.'!'] = array($sha,$name,$age); } ksort($database); $row = reset($database); $topsha = $row[0];