提问人:Dogbert 提问时间:11/5/2010 更新时间:11/17/2022 访问量:101232
在 PHP 中作为数组键的数字字符串
A numeric string as array key in PHP
问:
是否可以使用数字字符串作为 PHP 数组中的键,而不将其转换为整数?"123"
$blah = array('123' => 1);
var_dump($blah);
指纹
array(1) {
[123]=>
int(1)
}
我想要
array(1) {
["123"]=>
int(1)
}
答:
您可以将键类型转换为字符串,但由于 PHP 的松散类型,它最终会转换为整数。亲眼看看:
$x=array((string)123=>'abc');
var_dump($x);
$x[123]='def';
var_dump($x);
从PHP手册:
键可以是整数,也可以是字符串。如果密钥是标准 整数的表示,它将被解释为(即 “8”将被解释为8,而“08”将被解释为“08”)。 键中的浮点数被截断为整数。索引和关联 数组类型在 PHP 中是相同的类型,都可以包含整数 和字符串索引。
评论
[42 => 'answer', 'snafu' => 'fubar']
洛伊不,不是:
从手册:
键可以是整数,也可以是字符串。如果一个键是整数的标准表示形式,它将被解释为整数(即“8”将被解释为8,而“08”将被解释为“08”)。
补遗
由于下面的评论,我认为指出该行为与 JavaScript 对象键相似但不完全相同会很有趣。
foo = { '10' : 'bar' };
foo['10']; // "bar"
foo[10]; // "bar"
foo[012]; // "bar"
foo['012']; // undefined!
评论
+
如果您需要在 php 数据结构中使用数字键,则对象将起作用。对象保持秩序,因此您可以进行迭代。
$obj = new stdClass();
$key = '3';
$obj->$key = 'abc';
评论
array()
我在同时使用“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";
}
}
解决方法是在使用前将数组键转换回字符串。
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";
}
}
评论
我的解决方法是:
$id = 55;
$array = array(
" $id" => $value
);
空格 char (prepend) 是一个很好的解决方案,因为保持 int 转换:
foreach( $array as $key => $value ) {
echo $key;
}
您会看到 55 为 int。
评论
"0$id" => $value
0
array
我在尝试合并同时具有字符串和整数键的数组时遇到了这个问题。重要的是,整数也将作为字符串处理,因为这些是输入字段的名称(如鞋码等,..
当我使用PHP时,会“重新排序”键。在尝试进行排序时,整数键(我尝试使用 - - 甚至作为键)从 0 重命名为 ...如果你仔细想想,在大多数情况下,这将是理想的行为。$data = array_merge($data, $extra);
6
'6'
"6"
(string)"6"
n
您可以通过改用来解决此问题。
很简单,但我一开始没有想到^^。$data = $data + $extra;
评论
我在尝试对数组进行排序时遇到了这个问题,其中我需要排序键是十六进制 sha1。当生成的 sha1 值没有字母时,PHP 会将键转换为整数。但是我需要根据字符串的相对顺序对数组进行排序。因此,我需要找到一种方法,在不更改排序顺序的情况下强制键为字符串。
查看 ASCII 图表 (https://en.wikipedia.org/wiki/ASCII),感叹号的排序与空格大致相同,并且肯定低于所有数字和字母。
所以我在键字符串的末尾附加了一个感叹号。
for(...) {
$database[$sha.'!'] = array($sha,$name,$age);
}
ksort($database);
$row = reset($database);
$topsha = $row[0];
评论
是的,可以通过数组转换对象来实现: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 开始,也可以使用数字字符串作为键来引用值:
var_dump( $data['12'] ); // int 32
评论
echo $data['12'];
array_key_exists
包含有效整数的字符串将被强制转换为整数类型。例如,键“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
}
评论
关于@david解决方案,请注意,当您尝试访问关联数组中的字符串值时,数字将不起作用。我的猜测是它们在后台(访问数组时)被转换为整数,并且没有找到任何值。以整数形式访问这些值也不起作用。但是您可以使用 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)
评论
"0"
0
7.2.10
作为解决方法,您可以使用 JSON_FORCE_OBJECT 选项将 PHP 数组编码为 json 对象。
即,这个例子:
$a = array('foo','bar','baz');
echo "RESULT: ", json_encode($a, JSON_FORCE_OBJECT);
将导致:
RESULT: {"0" : "foo", "1": "bar", "2" : "baz"}
评论
, JSON_FORCE_OBJECT
) 和 json_encode((object) $a)
之间的区别。
评论
"123"
123
array_merge
asort