好。现在我放弃了。我已经玩了几个小时。
$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
stdClass::
之后的第14行) - 怎么样?如何才能访问stdClass::__set_state
部分中的值?
我尝试了var_export($data->parts);
,但我得到的只是
NULL
答案 0 :(得分:3)
此变量是否以您发布的方式声明?像:
$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
就可以了。
答案 1 :(得分:0)
我在开源邮件服务器Postal中遇到了类似的问题。在这种情况下,我使用API发送了两个收件人的电子邮件。 API返回JSON,我要对其进行处理以获取Postal已分配给每条消息的消息ID。根据print_r,JSON字符串将解码为一系列嵌套对象。
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(array(”。但是此对象中根本没有数组。实际上,此结构只包含嵌套的对象和属性。
在我问一个正确的问题之前,这种情况一直很合适:对象属性的名称是什么?
现在,编程解决方案相对容易,因为PHP为此提供了功能。我使用get_object_vars()来获取messages对象中的属性数组。通过简单地循环访问该数组,我可以访问每个地址的id和token属性。这是代码,以及来自Postal的示例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>');
之所以如此困难,是因为Postal设计在message对象中使用了可变属性名称。我本来可以将消息制成一个数组,然后将电子邮件地址与名为id的属性和令牌一起放入名为address的属性。但这就是它,我希望这对其他人有帮助。