Php 如何访问名为整数或无效属性名的对象属性?
我使用的是Php 如何访问名为整数或无效属性名的对象属性?,php,object,properties,Php,Object,Properties,我使用的是json\u decode()类似于: $myVar = json_decode($data) print $myVar->highlighting->448364->Data->0; $highlighting = (array)$myVar->highlighting; $data = (array)$highlighting['448364']->Data; $value = $data['0']; // at last! 这给了我这样的
json\u decode()
类似于:
$myVar = json_decode($data)
print $myVar->highlighting->448364->Data->0;
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0']; // at last!
这给了我这样的输出:
[highlighting] => stdClass Object
(
[448364] => stdClass Object
(
[Data] => Array
(
[0] => Tax amount liability is .......
我想访问键[0]中的字符串值。当我尝试做以下事情时:
$myVar = json_decode($data)
print $myVar->highlighting->448364->Data->0;
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0']; // at last!
我得到这个错误:
分析错误:语法错误,意外的T_DNUMBER
那里的两个数字/整数似乎有问题。恐怕不允许您以数字开头命名对象。将第一个名称重命名为“448364”,以字母开头 第二个是一个数组,可以通过括号访问,如下所示:
print myVar->highlighting->test_448364->Data[0]
相反恐怕你不允许以数字开头命名对象。将第一个名称重命名为“448364”,以字母开头 第二个是一个数组,可以通过括号访问,如下所示:
print myVar->highlighting->test_448364->Data[0]
相反,我从网上复制了这个函数。如果它按说明工作(“将stdClass对象转换为多维数组的函数”),请尝试以下操作:
<?php
function objectToArray($d) {
if (is_object($d)) {
// Gets the properties of the given object
// with get_object_vars function
$d = get_object_vars($d);
}
if (is_array($d)) {
/*
* Return array converted to object
* Using __FUNCTION__ (Magic constant)
* for recursive call
*/
return array_map(__FUNCTION__, $d);
}
else {
// Return array
return $d;
}
}
?>
$arr = array('123' => 'abc');
$obj = (object) $arr;
$obj->{'123'} = 'abc';
print_r( $obj );
$obj = json_decode(json_encode($arr));
- 首先将数组传递给
函数objectToArray
- 然后取返回值
- echo
[突出显示][448364][Data][0]
来源:我从网上复制了这个函数。如果它按说明工作(“将stdClass对象转换为多维数组的函数”),请尝试以下操作:
<?php
function objectToArray($d) {
if (is_object($d)) {
// Gets the properties of the given object
// with get_object_vars function
$d = get_object_vars($d);
}
if (is_array($d)) {
/*
* Return array converted to object
* Using __FUNCTION__ (Magic constant)
* for recursive call
*/
return array_map(__FUNCTION__, $d);
}
else {
// Return array
return $d;
}
}
?>
$arr = array('123' => 'abc');
$obj = (object) $arr;
$obj->{'123'} = 'abc';
print_r( $obj );
$obj = json_decode(json_encode($arr));
- 首先将数组传递给
函数objectToArray
- 然后取返回值
- echo
[突出显示][448364][Data][0]
原始答案(适用于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!
不幸的是,这不是递归的。因此,在您的情况下,您需要执行以下操作:
$myVar = json_decode($data)
print $myVar->highlighting->448364->Data->0;
$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编码(这是的要求)。针对PHP 7.2更新
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!
不幸的是,这不是递归的。因此,在您的情况下,您需要执行以下操作:
$myVar = json_decode($data)
print $myVar->highlighting->448364->Data->0;
$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的“核”缺点,另外还有一个缺点,即如果对象中有任何字符串,那么这些字符串必须用UTF-8编码(这是的一个要求)。只是想在Jon雄辩的解释中添加失败的原因。这都是因为在创建数组时,php会将键转换为整数(如果可以的话),这会导致已转换为对象的数组出现查找问题,原因很简单,因为