好的。 现在,我放弃了。 我一直在玩这个了好几个小时。
- 我有一个变量名
$data
。 变量包含这些内容:(通过使用提取var_export()
array ( 'headers' => array ( 'content-type' => 'multipart/alternative; boundary="_689e1a7d-7a0a-442a-bd6c-a1fb1dc2993e_"', ), 'ctype_parameters' => array ( 'boundary' => '_689e1a7d-7a0a-442a-bd6c-a1fb1dc2993e_', ), 'parts' => array ( 0 => stdClass::__set_state(array( 'headers' => array ( 'content-type' => 'text/plain; charset="iso-8859-1"', 'content-transfer-encoding' => 'quoted-printable', ), 'ctype_primary' => 'text', )), ), )
我删除了一些非必要的数据。
- 我要访问的头值(第二线以上) -简单:
$data->headers
- 我想(在后第14行访问的头值
stdClass::
东西) -怎么样?
我怎么可能在中访问值stdClass::__set_state
部分?
我试图var_export($data->parts);
但我得到的是
空值
这个变量声明你张贴的方式? 喜欢:
$data = array(
'headers' =>
array (
…
在这种情况下,我不太清楚你如何可以访问'headers'
通过$data->headers
。 它应该是$data['headers']
因为它是一个数组,而不是一个对象。
再往下, stdClass::__set_state(array('headers' => …))
静态地调用该方法 __set_state
类的stdClass
。 不管这种方法确实我不知道,但只有它的返回值将被分配到'parts' => array(0 => ...)
键。
如果OTOH你正在展示的结果是var_dump($data)
,那么这是不正确的废话,因为stdClass::__set_state()
将永远不会在出现var_dump
。 事情是无论是在你的代码或者腥你张贴,很难没有看到更多的不必多说。
忽略上面, var_export
版画类这种时髦的方式。
$data['headers']
应该第一头部分做到这一点。 再往下, $data['parts'][0]->headers
应该做的伎俩。
我跑进与开源邮件服务器类似的问题邮政 。 在这种情况下,我使用的API与两个收件人发送电子邮件。 该API返回JSON,我想过程中得到ID邮政已分配给每个消息的消息。 JSON字符串进行解码,以一系列嵌套的对象,根据的print_r。
pObj: stdClass Object
(
[status] => success
[time] => 0.28
[flags] => stdClass Object
(
)
[data] => stdClass Object
(
[message_id] => a122e786-6c32-4085-b1ed-023e5923ca38@rp.postal.domain.com
[messages] => stdClass Object
(
[name1@domain1.com] => stdClass Object
(
[id] => 180
[token] => AblVpj6UW2wh
)
[name2@domain2.com] => stdClass Object
(
[id] => 181
[token] => io5wgEXO1boH
)
)
)
)
望着结构,最初几层是容易提取。 麻烦的是,消息对象都有一个名为每个收件人的电子邮件地址的属性。 如果不知道这些地址值是先验的,我无法访问个别收件人对象编程得到的消息ID。
我也研究过这个使用对象的var_dump()和var_export()。 这就是我看到了这个奇怪的和误导性的语法:“stdClass的:: __ set_state(阵列(”但也有不惜一切在这个对象没有列在现实中,这个结构中包含什么,但嵌套的对象和属性。
这种情况是给我适合,直到我问正确的问题:什么是一个对象的属性的名称是什么?
现在的编程解决方案是比较容易的,因为PHP具有该功能。 我用get_object_vars()消息中的对象获取的属性的数组。 通过简单地认为阵列上循环,然后我可以访问每个地址的ID和令牌属性。 下面的代码,从邮政样本JSON响应。
define('_EOL', "\n");
$json='{"status":"success","time":0.28,"flags":{},"data":{"message_id":"a122e786-6c32-4085-b1ed-023e5923ca38@rp.postal.domain.com","messages":{"name1@domain1.com":{"id":180,"token":"AblVpj6UW2wh"},"name2@domain2.com":{"id":181,"token":"io5wgEXO1boH"}}}}';
$pObj=json_decode($json);
$str='<pre>pObj: '.print_r($pObj, true)._EOL._EOL;
$str.=' - status='.$pObj->status._EOL;
$msgVars=get_object_vars($pObj->data->messages);
foreach ($msgVars as $varKey=>$msgObj)
{
$str.=' - '.$varKey.':'._EOL;
$str.=' - id='.$msgObj->id._EOL;
$str.=' - token='.$msgObj->token._EOL;
}
echo($str.'</pre>');
是什么让这个艰难的是,邮政设计使用的消息变量属性名对象。 我会作出消息的阵列,把电子邮件地址的命名地址属性与属性ID和令牌一起。 但是,它是什么,我希望这可以帮助别人。