1

好的。现在我放弃了。我已经玩了几个小时了。

  • 我有一个变量名$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::东西之后的第十四行) - 如何?

我怎样才能访问该stdClass::__set_state部分中的值?

我试过var_export($data->parts);了,但我得到的只是

空值

4

2 回答 2

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应该可以解决问题。

于 2010-04-17T03:14:37.777 回答
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() 来获取消息对象中的属性数组。通过简单地循环该数组,我可以访问每个地址的 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 设计在消息对象中使用变量属性名称。我会将消息制作成一个数组,并将电子邮件地址与属性 id 和令牌一起放入名为 address 的属性中。但它就是这样,我希望这对其他人有帮助。

于 2018-08-31T03:12:10.890 回答