php - 数组中 undefined index ,但它在那里

标签 php arrays

我有一个数组。这是它的 var_dump:

array(1) {
  ["139"]=>
  string(5) "my_data"
}

我们看到,我们有 key 139,它是字符串( key 的 var 转储: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

为什么???我有一个字符串变量,所有的键都是字符串。怎么可能?

最佳答案

简答题

ArrayObject 进行类型转换 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 自己处理所有事情。表示 integerstring 类型的数组键会自动转换为 integer
然后,当我们转换它时没问题,它成为 $good 对象的属性(具有 integer 类型),即使它不可访问(因为它试图到达 "139" 属性,而不是 139)。 (NULL 返回)
当我们对数组 $good_arr 进行转换时,数据结构没有改变,我们仍然可以访问它,因为它到达 139 而不是 "139 ".

在糟糕的情况下

这里的对象是由json_decode重新生成的。此函数不会生成坏对象(这是一件好事!),因此所有属性的类型都是 string
这就是为什么我们可以直接从这里的对象访问属性。这是一个有效的属性(类型 string),因此我们可以访问它。
但正如文档中所述,当我们将其转换回 array 时,数据结构没有改变,因此我们无法访问它。我们要么写 $bad_arr[139] 要么 $bad_arr["139"] 它将尝试使用键 139 访问值( NULL 返回),当它实际访问 "139" 时。

结论

这是 PHP 魔法的典型示例。在数组中自动将 string 转换为 int 是导致您出现问题的原因。

因此,您使用 json_decodeassoc 参数的解决方案似乎是唯一适用于此的解决方案:

json_decode($json_arr, true); 

关于php - 数组中 undefined index ,但它在那里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21304638/

相关文章:

php - 如何获取 DomElement 的字符串?

php - 如何更改 WampServer 3 上的 www 根目录

arrays - Delphi 数组与对象

javascript - 为什么将 0 作为数组的第一个元素会阻止 "for"循环执行。 [JavaScript]

php - Symfony2 : init EntityType field with empty data

javascript - 从地址变量到谷歌地图

php - 如何在opencart中使用参数化查询/准备语句?

iOS 5 以编程方式将数组添加到选择器

C++ 赋值,strcpy 和 strlen 与字符数组 n 指针

javascript - 无法从对象数组中检索数据?