php – 数组中未定义的索引,但它就在那里
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – 数组中未定义的索引,但它就在那里,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3378字,纯文字阅读大概需要5分钟。
内容图文
![php – 数组中未定义的索引,但它就在那里](/upload/InfoBanner/zyjiaocheng/724/26ff86678a2e4f088f0c695a2361c75c.jpg)
我有一个阵列.这是var_dump:
array(1) {
["139"]=>
string(5) "my_data"
}
我们看到,我们有密钥139,它是字符串(密钥的var转储:字符串(3)“139”).
我想从数组中获取元素,这是代码:
$bad_array = $this->get('some_data');
var_dump($bad_array);
var_dump($my_key);
var_dump(isset($bad_array[$my_key]));
var_dump($bad_array[$my_key]);
这是输出:
array(1) {
["139"]=>
string(5) "my_data"
}
string(3) "139" // my key output
bool(false) // it's not isset
Notice: Undefined index: 139 in /my_file_path.php on line 89
NULL
为什么???我有一个字符串变量,所有键都是字符串.怎么会这样?
解决方法:
简答
来自Object doesn’t work with integer properties (as strings i.e. “139”)的数组类型转换.
答案很长
一堆测试代码:
<pre>
<?php
$arr = array("139" => "some_data", "test" => "other_data");
$good = (object) $arr;
$good_arr = (array) $good;
$bad = json_decode(json_encode($arr));
$bad_arr = (array)($bad);
var_dump ($arr);
foreach ($arr as $k => $v)
var_dump (gettype ($k)); // 139 is integer
var_dump ($good);
foreach ($good as $k => $v)
var_dump (gettype ($k)); // 139 is integer
var_dump ($good_arr);
foreach ($good_arr as $k => $v)
var_dump (gettype ($k)); // 139 is integer
var_dump ($bad);
foreach ($bad as $k => $v)
var_dump (gettype ($k)); // 139 is string
var_dump ($bad_arr);
foreach ($bad_arr as $k => $v)
var_dump (gettype ($k)); // 139 is string
var_dump ($arr[139]); // string(9) "some_data"
var_dump ($arr["139"]); // string(9) "some_data"
var_dump ($arr["test"]); // string(10) "other_data"
var_dump ($good->{139}); // NULL
var_dump ($good->{"139"}); // NULL
var_dump ($good->{"test"}); // string(10) "other_data"
var_dump ($good_arr[139]); // string(9) "some_data"
var_dump ($good_arr["139"]); // string(9) "some_data"
var_dump ($good_arr["test"]); // string(10) "other_data"
var_dump ($bad->{139}); // string(9) "some_data"
var_dump ($bad->{"139"}); // string(9) "some_data"
var_dump ($bad->{"test"}); // string(10) "other_data"
var_dump ($bad_arr[139]); // NULL
var_dump ($bad_arr["139"]); // NULL
var_dump ($bad_arr["test"]); // string(10) "other_data"
?>
</pre>
bin2hex实际上显示的是完全相同的值,并且foreach工作正常.
那么,当我们试图直接访问它时,它怎么可能不起作用呢?
最后一个显示正常的是多么奇怪?
嗯,实际上,我得到了part from the doc talking about array type casting第二个问题的答案
正如您在那里看到的,当使用类型转换将对象转换为数组时,这不适用于无法访问的数字属性.
对于第一个问题,我将假设类型转换不会改变数据在内存中的表示方式,因此它仍然可以像对象一样迭代它.
接下来是我对两种情况之间差异的假设:
在好的情况下
PHP正在自己处理所有东西.表示整数的字符串类型的数组键自动转换为整数.
然后,当我们转换它时没有问题,它变成$good对象的属性(具有整数类型),即使它不可访问(因为它试图达到“139”属性,而不是139). (返回NULL)
当我们对数组$good_arr执行转换时,数据结构没有改变,我们仍然可以访问它,因为它达到139而不是“139”.
在糟糕的情况下
这里的对象由json_decode重新生成.这个函数不会生成坏对象(这是件好事!),因此所有属性都有类型字符串.
这就是为什么我们可以直接从这里的对象访问该属性.它是一个有效的属性(类型字符串),所以我们可以访问它.
但正如文档中所述,当我们将其转换回数组时,数据结构没有改变,因此我们无法访问它.我们写$bad_arr [139]或$bad_arr [“139”]它将尝试使用键139(返回NULL)访问该值,当它实际应该访问“139”时.
结论
这是PHP魔术的典型例子.在数组中自动将字符串转换为int是导致问题的原因.
因此,使用json_decode的assoc参数的解决方案似乎是唯一可以在这里工作的解决方案:
json_decode($json_arr, true);
内容总结
以上是互联网集市为您收集整理的php – 数组中未定义的索引,但它就在那里全部内容,希望文章能够帮你解决php – 数组中未定义的索引,但它就在那里所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。