我有一个数组。这是 var_dump:
array(1) {
["139"]=>
string(5) "my_data"
}
我们看到,我们有键 139,它是字符串(键的 var dumps: string(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
为什么 ???我有一个字符串变量,所有的键都是字符串。怎么会这样?
最佳答案
简答 Array
来自 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
自己处理所有事情。表示 string
的 integer
类型的数组键会自动转换为 integer
。然后,当我们转换它时没问题,它变成了
integer
对象的属性(具有 $good
类型),即使它不可访问(因为它试图访问 "139"
属性,而不是 139
)。 ( NULL
返回)当我们对数组
$good_arr
进行转换时,数据结构没有改变,我们仍然可以访问它,因为它到达 139
而不是 "139"
。在糟糕的情况下
这里对象由
json_decode
重新生成。此函数不会生成坏对象(这是一件好事!),因此所有属性都将具有 string
类型。这就是我们可以直接从这里的对象访问属性的原因。它是一个有效的属性(类型
string
),因此我们可以访问它。但是正如文档中所说,当我们将它转换回
array
时,数据结构没有改变,所以我们无法访问它。无论我们编写 $bad_arr[139]
还是 $bad_arr["139"]
,它都会尝试使用键 139
(返回 NULL
)访问该值,而实际上它应该访问 "139"
。结论
这是
PHP
魔法的典型例子。在数组中自动将 string
s 转换为 int
是导致您出现问题的原因。因此,您使用
assoc
的 json_decode
参数的解决方案似乎是唯一可以在这里工作的解决方案:json_decode($json_arr, true);
关于php - 数组中 undefined index ,但它在那里,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21304638/