php int4变成数字44,【php】如何解决php数字键名会被强转成整型的问题

1.问题描述

$result = [

'12w'=>'大扫除',

'3.3'=>' 搜索 ',

'456' => '333',

789 => 1266

];

var_dump($result);

/*

result is :

*********************

array(4) {

["12w"]=>

string(9) "大扫除"

["3.3"]=>

string(8) " 搜索 "

[456]=>

string(3) "333"

[789]=>

int(1266)

}

*/

2.尝试解决方案(均不生效):

①加单引号、双引号 如’456′ => ‘333’

②用string强转 如(string)789 => 1266

③用strval强转 如strval(789) => 1266

$result1 = [

'12w'=>'大扫除',

'3.3'=>' 搜索 ',

'456' => '333',

(string)789 => 1266

];

$result2 = [

'12w'=>'大扫除',

'3.3'=>' 搜索 ',

'456' => '333',

strval(789) => 1266

];

3.问:

在不修改数字键名的值的情况下,如何得到数字键名还是以字符串类型存在而不是以整型存在?

(

①不修改指不将’456’改为’456.0’、’456.’、’_456’等

②使用的版本为PHP5.3

③最好以PHP5.3为前提讨论,但是不限于PHP5.3,如果以前版本或者以后版本有相关解决方案也欢迎提出,因涉及数据安全,故也选了PHP安全的分类

)

4.扩展阅读-数字键名的危害

①键名长度只能在 int 长度范围内,超过int 范围后将会出现覆盖等混乱情况

②在键名长度为 int 范围内存取值时,PHP会强制将数字键名转换为 int 数值型

③数字键名长度大于19位时,将变成 0

引用:http://blog.csdn.net/zhouzme/…

④array_merge时,相同键名后者不覆盖前者

引用:http://blog.csdn.net/sky_zhe/…

以上是常规危害,更多的时候会有业务危害,比如我们跟客户端对接时,往往客户端使用java,objectC等强类型语言,会存在类型不同导致很多坑

回答

dream 说的已经很详细的。 我这里补充个解决方法:

如果你的这个数组的key全都是string类型的,可以考虑通过 stdClass 转换下,比如:

$result = new stdClass();

$result->{'12w'} = '大扫除';

$result->{'3.3'} = ' 搜索 ';

$result->{'456'} = '333';

$result->{789} = 1266;

var_dump($result);

// 输出:(可以看到键全都是string类型的)

// object(stdClass)#1 (4) {

// ["12w"]=>

// string(9) "大扫除"

// ["3.3"]=>

// string(8) " 搜索 "

// ["456"]=>

// string(3) "333"

// ["789"]=>

// int(1266)

// }

// 转换为array:

var_dump((array)$result);

// 输出:(可以看到键全都是string类型的)

// array(4) {

// ["12w"]=>

// string(9) "大扫除"

// ["3.3"]=>

// string(8) " 搜索 "

// ["456"]=>

// string(3) "333"

// ["789"]=>

// int(1266)

// }

这个转换从 PHP 5.0.0 到最新的 PHP 5.1.3 应该都是支持的。在线代码执行:https://3v4l.org/7Ot6b

PHP 数组可以同时含有 integer 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。

只要是数字型字符串都会转换为数字

key 会有如下的强制转换:

包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。

浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。

布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。

Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。

数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type

1 我想问问你为什么要这样做

2 最简单的办法统一加个字母不就行了,使用的时候也统一加上就ok了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值