在 PHP 数组中,是否可以使用数字字符串(如 "123"
)作为键名,而不会被转换为整数?
$blah = array('123' => 1);
var_dump($blah);
打印
array(1) {
[123]=>
int(1)
}
我想要
array(1) {
["123"]=>
int(1)
}
在 PHP 数组中,是否可以使用数字字符串(如 "123"
)作为键名,而不会被转换为整数?
$blah = array('123' => 1);
var_dump($blah);
打印
array(1) {
[123]=>
int(1)
}
我想要
array(1) {
["123"]=>
int(1)
}
不是的;不,它不是:
来自手册:
键名可以是整数或字符串。如果一个键名是整数的标准表现形式,它将被作为整数解析(例如,“8”将被解析为8,而“08”将被解析为“08”)。
补充说明
由于下面的评论,我想指出这种行为与JavaScript对象键的行为类似,但不是完全相同的。
foo = { '10' : 'bar' };
foo['10']; // "bar"
foo[10]; // "bar"
foo[012]; // "bar"
foo['012']; // undefined!
+
代替合并,或使用许多内置函数来保留键。如果您需要在从数组中读取时再次将键作为字符串使用,则将其转换为字符串可以保证返回原始值。 - Walf$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'];
。这将会产生一个错误提示:"Notice: Undefined offset: 12 in - on line 5"。 - Mr. Lance E Sloanarray_key_exists
也找不到它。 - Don't Panicarray_flip(array_reverse(array_flip($original)))
,因为我只有(唯一的)月份名称作为值。 - Adam P.我的解决方法是:
$id = 55;
$array = array(
" $id" => $value
);
空格字符(prepend)是一个好的解决方案,因为它保持了整数转换:
foreach( $array as $key => $value ) {
echo $key;
}
你会看到数字55以整数形式呈现。
$obj = new stdClass();
$key = '3';
$obj->$key = 'abc';
您可以将键强制转换为字符串,但由于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']
。 - Mr. Lance E Sloan我曾经遇到过一个问题,想要合并同时包含字符串和整数键的数组。由于其中的整数键是输入字段的名称(例如鞋码等),因此很重要将其视为字符串处理。
当我使用$data = array_merge($data, $extra);
时,PHP会“重新排序”键。在尝试排序时,整数键(我尝试使用6
- '6'
-"6"
以及(string)"6"
作为键)从0到n
被重命名...如果你考虑一下,在大多数情况下这应该是期望的行为。
您可以通过使用$data = $data + $extra;
来解决这个问题。非常简单,但我起初没有考虑到 ^^。
$a = array('foo','bar','baz');
echo "RESULT: ", json_encode($a, JSON_FORCE_OBJECT);
将产生以下结果:
RESULT: {"0" : "foo", "1": "bar", "2" : "baz"}
json_encode($a, JSON_FORCE_OBJECT)
和json_encode((object) $a)
之间的区别。 - Walf$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
。 - J.BizMai$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
}
$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";
}
}
"123"
==123
。那么为什么你特别需要它作为一个字符串(以及有一个整数是不好的)? - ircmaxellarray_merge
。*"如果输入的数组具有相同的字符串键,则该键的后一个值将覆盖前一个值。但是,如果数组包含数字键,则后一个值不会覆盖原始值,而是会被追加。"* - ficuscrasort
函数。 - swenedo