【问题标题】:Cannot access PHP array value无法访问 PHP 数组值
【发布时间】:2013-12-15 18:35:35
【问题描述】:

我有这段代码:

$object = new StdClass();
$object->{'1'} = 'test_1';
$object->a = 'test_a';
$array = (array) $object;

var_dump($array) 工作正常,返回

array (size=2)
  '1' => string 'test_1' (length=6)
  'a' => string 'test_a' (length=6)

然而,

var_dump($array[1]);   //returns null
var_dump($array['1']); //returns null
var_dump($array["1"]); //returns null

有人可以解释这种行为吗? 为什么我无法访问我可以看到存在的属性?

【问题讨论】:

  • 看看这个答案和cmets:stackoverflow.com/a/4345609/722135
  • 你能解释一下 inaccessible 代表什么吗?由于var_dump 显示它,foreach 也显示它!
  • 这是一个 PHP 的“特性”(也就是 bug)。

标签: arrays object php-5.4


【解决方案1】:

你的结果很好。正如在 PHP 中所期望的那样 - 因为实际上是数字的字符串键 will be converted to integers - 无论是在数组的定义中还是在尝试取消引用它们时。这不是您应该使用数组的方式 - 即转换对象。是的 - 这种转换是一种获取字符串数字键的方法 - 但后果是你自己的。

您可以通过以下方式提取此类值:

function getValue($array, $key)
{
   foreach($array as $k=>$value)
   {
      if($k===$key)
      {
         return $value;
      }
   }
   return null;
}

$object = new StdClass();
$object->{'1'} = 'test_1';
$object->a = 'test_a';
$array = (array) $object;

var_dump(getValue($array, '1'), getValue($array, 1));

-但我绝对不建议以这种方式使用数组。

多说一句——PHP 中有诸如ArrayAccess 之类的东西,可以让你为你的数据结构实现自定义逻辑——并且,使用它们,你将能够以正常的方式克服这个限制。

【讨论】:

  • 1) 我来之前也有过,但情况不一样,如果只是将数字键转换为整数,我仍然可以得到 $array[1]。 2)我知道如何克服这个问题,但我想了解发生了什么
  • 所以我已经解释了,通过 '实际上是数字的字符串键将被转换为整数 - 无论是在数组的定义中还是在尝试取消引用它们时' - 即 PHP将"1" 视为数组定义中的1 或通过[] 访问它的元素
猜你喜欢
  • 2016-11-12
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 2010-10-18
  • 2015-09-16
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多