【问题标题】:PHP array with numeric keys as string can't be used [duplicate]不能使用数字键作为字符串的PHP数组[重复]
【发布时间】:2012-07-15 23:07:21
【问题描述】:

我有一个 PHP 数组,它具有字符串类型的数字键。

但是当我尝试访问它们时,PHP 给了我一个未定义的索引错误。

$a = (array)json_decode('{"1":1,"2":2}');
var_dump($a);
var_dump(isset($a[1]));
var_dump(isset($a["1"]));
var_dump($a[1]);
var_dump($a["1"]);

输出:

数组(大小=2) '1' => 整数 1 '2' => 整数 2 布尔假 布尔假 错误:E_NOTICE:未定义的偏移量:1 空值 错误:E_NOTICE:未定义的偏移量:1 空值

如何访问这些值?

演示:http://codepad.viper-7.com/8O03IM

【问题讨论】:

  • 在过期前给声望+100。
  • @JosuaMarcelChrisano:距离赏金到期还有整整 6 天。赏金活动昨天才开始。让他休息一下。 6天后你也不需要再提醒他了,系统会提醒的。

标签: php arrays json


【解决方案1】:

所以,我还没有看到任何其他答案涉及到这一点,但@xdazz 接近了。

让我们开始我们的环境,$obj 等于解码字符串的对象表示法:

php > $obj = json_decode('{"1":1,"2":2}');

php > print_r($obj);
stdClass Object
(
    [1] => 1
    [2] => 2
)

php > var_dump( $obj );
object(stdClass)#1 (2) {
  ["1"]=>
  int(1)
  ["2"]=>
  int(2)
}

如果你想访问字符串,我们知道下面会失败:

php > echo $obj->1;

Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `'{'' or `'$'' in php shell code on line 1

访问对象变量

你可以这样访问它:

php > echo $obj->{1};
1

这和说的一样:

php > echo $obj->{'1'};
1

访问数组变量

数组的问题是下面的返回空白,这是类型转换的问题。

php > echo $obj[1];
php >

如果您将其类型转换回来,则该对象将再次可访问:

php > $obj = (object) $obj;
php > echo $obj->{1};
1

这是一个可以为您自动执行上述操作的函数:

function array_key($array, $key){
    $obj = (object) $array;
    return $obj->{$key};
}

示例用法:

php > $obj = (array) $obj;
php > echo array_key($obj, 1);
1

php > echo array_key($obj, 2);
2

【讨论】:

    【解决方案2】:

    如果要数组,请将json_decode的第二个参数设置为true

    $a = json_decode('{"1":1,"2":2}', true);
    

    编辑: 当您将 std 对象转换为数组时,数字字符串键不会转换为数字。 这是一个例子。

    $obj = new stdClass;
    $obj->{'1'} = 1;
    $arr = (array) $obj;
    var_dump($arr);
    var_dump(isset($arr[1]));
    

    【讨论】:

    • 谢谢,这对我的问题有用。不过,如果您能找到一种使用这些类型的键访问数组的方法,则可以加分。
    • @Petah 这是php的问题,但是你还是可以通过foreach获取key和value。
    【解决方案3】:

    显然,这是一个已知问题,并且没有修复它的计划;见Doc Bug #45959 Object to array conversion leads to weird behaviour:

    修复意味着性能下降,因此最好将其保留为已知问题,但记录在案。

    (然后)在documentation for the array type(强调我的)中指出了这种古怪:

    如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名称,但有一些值得注意的例外:整数属性不可访问....这可能会导致一些意外行为....

    【讨论】:

    • 不错的答案!我不得不说,强制转换为数组已经被打破,足以声明一条新规则:永远不要在 PHP 中将任何内容强制转换为数组。
    【解决方案4】:

    是的。我同意,PHP 存在从对象到数组的类型转换问题,但 foreach 正在智能地处理对象或关联数组。

    $a = json_decode('{"1":1,"2":2}'); //need not typecast but doesnt break even if u typecast
    
    foreach ($a as $k=>$v){
        echo $v;
    }
    

    【讨论】:

      【解决方案5】:

      我最近遇到了同样的问题。

      $obj = new stdClass();
      $obj->{'0'} = "test";
      
      $array = (array)$obj;
      foreach ($array as $key => $value) {
         $array[$key] = strtoupper($value);
      }
      var_dump($array);
      

      此代码输出:

      array(2) {
        ["0"]=>
        string(4) "test"
        [0]=>
        string(4) "TEST"
      }
      

      发现在调试递归对象转数组的方法时,我已经疯了。

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题(但使用 array_intersect_key)。

        这是我的解决方案:

        $array = array_combine(array_keys($array), $array);
        

        【讨论】:

          猜你喜欢
          • 2019-03-02
          • 2018-11-09
          • 2017-07-28
          • 1970-01-01
          • 2020-02-14
          • 2020-02-28
          • 2014-05-11
          • 1970-01-01
          相关资源
          最近更新 更多