Come accedere i membri di questi dati in PHP?
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
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.