当前位置: 首页 > 面试题库 >

如何使用名称(如整数)访问对象属性?

夏侯和韵
2023-03-14
问题内容

我正在使用json_decode()类似的东西:

$myVar = json_decode($data)

这给了我这样的输出:

[highlighting] => stdClass Object
        (
            [448364] => stdClass Object
                (
                    [Data] => Array
                        (
                            [0] => Tax amount liability is .......

我想访问键[0]中的字符串值。当我尝试做类似的事情时:

print $myVar->highlighting->448364->Data->0;

我收到此错误:

解析错误:语法错误,意外的T_DNUMBER

这两个数字/整数似乎有问题。


问题答案:

PHP7.2引入了一种行为上的更改,以转换对象和数组类型转换中的数字键,从而解决了这一特殊的不一致问题,并使以下所有示例的行为均符合预期。

少一件值得困惑的事情!

原始答案(适用于7.2.0之前的版本)

PHP拥有许多黑暗的小巷,您 确实 不想在其中发现自己。名称为数字的对象属性是其中之一…

他们从未告诉过你

事实1: 您不能轻易访问名称不是合法变量名称的属性

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo; // error

事实2:可以 使用大括号语法访问此类属性

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!

事实#3: 但是 没有 如果属性名称是所有的数字!

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
echo $o->{'123'}; // error!

事实4: 好吧,除非对象不是最初来自数组。

$a = array('123' => '123');
$o1 = (object)$a;
$o2 = new stdClass;
$o2->{'123'} = '123'; // setting property is OK

echo $o1->{'123'}; // error!
echo $o2->{'123'}; // works... WTF?

很直观,你不同意吗?

你可以做什么

选项1:手动执行

最实用的方法只是将您感兴趣的对象转换回数组,这将允许您访问属性:

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'}; // error!
echo $a['123']; // OK!

不幸的是,这不是递归的。因此,在您的情况下,您需要执行以下操作:

$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0']; // at last!

选择2:核选择

一种替代方法是编写一个将对象递归转换为数组的函数:

function recursive_cast_to_array($o) {
    $a = (array)$o;
    foreach ($a as &$value) {
        if (is_object($value)) {
            $value = recursive_cast_to_array($value);
        }
    }

    return $a;
}

$arr = recursive_cast_to_array($myVar);
$value = $arr['highlighting']['448364']['Data']['0'];

但是,我不认为这是一个更好的选择,因为它会不必要地将所有您 感兴趣的属性以及您所 感兴趣的属性强制转换为数组。

选择#3:发挥聪明

上一个选项的替代方法是使用内置的JSON函数:

$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];

JSON函数有助于对数组进行递归转换,而无需定义任何外部函数。无论看上去多么理想,它都具有选项#2的“ nuke”缺点, 另外还有_一个缺点,即如果对象中有任何字符串,则这些字符串 _必须
以UTF-8编码(这是的要求json_encode



 类似资料:
  • 我使用的是类似于: 这给了我这样的输出: 我想访问键[0]中的字符串值。当我尝试做以下事情时: 我得到这个错误: 分析错误:语法错误,意外的T_DNUMBER 这两个数字/整数似乎有问题。

  • 问题内容: 我正在使用有人编写的PHP类来与BaseCamp API交互。 我正在执行的特定呼叫是在待办事项列表中检索项目,效果很好。 我的问题是,我不确定如何仅访问返回的对象的属性。这是返回对象的var_dump: 如何访问此对象的一部分? 问题答案: 因此,$ object-> {‘todo-list’}是子对象。如果可以这样设置,那么您也可以以相同的方式阅读它。 如果您想将其转换为数组,可以

  • 问题内容: 如您所见,该回调函数从控制器获取数据。 例如: 在这种情况下,我的第一个警报给了我未定义的内容,第二个/第三个警报弹出窗口显示为: 如何按名称访问值,以便我的第一个警报填写的值是? 问题答案: 代替解析JSON,您可以执行以下操作: 要访问JSON的属性,请执行以下操作: 为什么需要数据,因为数据是一个数组,所以需要对其内容进行检索(第一个元素),它为您提供了一个object 。 并访

  • 问题内容: 我有一个JNI方法来访问返回一个Integer对象的java方法。我不想返回原始的int类型,因为将修改此代码以处理通用对象。以下是我所拥有的。我无法获得所传递的Integer的值。C ++端的输出类似于 如何获取在C ++端传递的Integer对象的实际值? 请帮忙。 谢谢, -H GenericPeer.cpp GenericPeer.java 资料库 Test.java(主类)

  • 问题内容: 我们如何使JSON属性名称动态化。例如 序列化此对象时,它另存为,但我想使键也像一样动态。任何帮助深表感谢。 问题答案: 您可以使用JsonAnySetter JsonAnyGetter批注。您可以在后面使用实例。万一您总是可以在其他情况下使用或其他实现。下面的示例显示了使用此方法并根据需要创建任意数量的-s是多么容易: 上面的代码打印:

  • 问题内容: 我正在编写一个与已在使用的Google Analytics(分析)API交互的Angular应用。Google返回的数据以“ ga:”为前缀,例如“ ga:newVisits”示例。 如果我使用表达式{{total.ga:newVisits}},Angular无法解析它。逃避冒号继续的任何尝试均导致错误或完全逃避我的表达。 如何将{{total.ga:newVisits}}传递给Ang