Domanda

Va bene. Ora mi arrendo. Ho giocato con questo per ore.

  • Ho un nome $data variabile.
  • La variabile contiene questi contenuti: (estratti utilizzando 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',
        )),
      ),
    )
    

    Ho rimosso alcuni dati non essenziali.

  • Voglio accedere al valore intestazioni (sulla seconda riga sopra) - semplice: $data->headers
  • Voglio accedere al valore intestazioni (sulla linea XIV dopo la roba stdClass::) - come

Come posso accedere ai valori all'interno della sezione stdClass::__set_state?

ho provato var_export($data->parts); ma tutto quello che ottiene è

  

NULL

È stato utile?

Soluzione

E 'questa variabile ha dichiarato il modo in cui ha postato? Come:

$data = array(
          'headers' =>
             array (
             …

In questo caso, io non sono molto sicuro di come è possibile accedere tramite 'headers' $data->headers. Dovrebbe essere $data['headers'], perché è un array, non un oggetto.

Più in basso, stdClass::__set_state(array('headers' => …)) chiama il metodo statico __set_state del stdClass di classe. Qualunque sia questo metodo non non lo so, ma solo il suo valore di ritorno sarà assegnato al tasto 'parts' => array(0 => ...).

Se OTOH quello che si sta mostrando è il risultato di var_dump($data), allora questa è una sciocchezza corretto, dal momento che non si sarebbe mai stdClass::__set_state() presentarsi in una var_dump. C'è qualcosa di pesce sia nel codice o in quello che hai postato ed è difficile dire senza vedere più di esso.

ignorare il, var_export classi stampe questo modo funky sopra.

$data['headers'] dovrebbe farlo per la prima parte intestazioni. Più in basso, $data['parts'][0]->headers dovrebbe fare il trucco.

Altri suggerimenti

mi sono imbattuto in un problema simile con il server di posta open-source postale . In questo caso, ho usato l'API per inviare un messaggio di posta elettronica con due destinatari. L'API restituisce JSON, che voglio processo per ottenere il messaggio ID postale ha assegnato a ciascun messaggio. Le decodifiche stringa JSON ad una serie di oggetti nidificati, secondo 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
                        )

                )

        )

)

Osservando la struttura, i primi livelli sono facili da estrarre. Il guaio è che i messaggi oggetto ha attributi di nome per ogni indirizzo di posta elettronica del destinatario. Senza conoscere questi valori di indirizzo a priori, non ho potuto accedere agli oggetti del singolo destinatario a livello di codice per ottenere il messaggio id.

Ho anche esaminato tale oggetto utilizzando var_dump () e var_export (). Ecco dove ho visto questa strana e fuorviante sintassi:... "StdClass :: __ set_state (array (" Ma non ci sono gli array a tutti in questo oggetto In realtà, questa struttura contiene nulla, ma gli oggetti nidificati e attributi

Questa situazione stava dando mi si adatta fino a quando ho chiesto il diritto domanda: quali sono i nomi di attributi di un oggetto

Ora la soluzione programmatica è relativamente facile perché PHP ha una funzione per questo. Ho usato get_object_vars () per ottenere un array di attributi nell'oggetto messaggi. Semplicemente loop su tale array, ho potuto quindi accedere agli attributi id e simbolico di ciascun indirizzo. Ecco il codice, con una risposta di esempio JSON dal postale.

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>');

Ciò che ha reso questo difficile è che il design postale utilizza nomi degli attributi variabili nell'oggetto messaggi. Avrei fatto i messaggi un array e inserire l'indirizzo di posta elettronica in un nome indirizzo attributo insieme con gli attributi id e token. Ma è quello che è, e spero che questo aiuta a qualcun altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top