如何解决php数字键名会被强转成整型的问题

转载地址 https://segmentfault.com/q/1010000008822020这两位已经说的很详细了,建议看原文,我是复制过来记录一下的

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.问:

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

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

①键名长度只能在 int 长度范围内,超过int 范围后将会出现覆盖等混乱情况
②在键名长度为 int 范围内存取值时,PHP会强制将数字键名转换为 int 数值型
③数字键名长度大于19位时,将变成 0
④array_merge时,相同键名后者不覆盖前者

5.解决

如果你的这个数组的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值