如何访问这些数据的成员在PHP?(How to access the members of this

2019-10-21 04:33发布

好的。 现在,我放弃了。 我一直在玩这个了好几个小时。

  • 我有一个变量名$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); 但我得到的是

空值

Answer 1:

这个变量声明你张贴的方式? 喜欢:

$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应该做的伎俩。



Answer 2:

我跑进与开源邮件服务器类似的问题邮政 。 在这种情况下,我使用的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和令牌一起。 但是,它是什么,我希望这可以帮助别人。



文章来源: How to access the members of this data in PHP?