Как получить доступ к членам этих данных в PHP?
Хорошо. Теперь я сдаюсь. Я играл с этим часами.
- У меня есть имя переменной
$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);
но все, что я получаю, это
НОЛЬ
2 ответа
Эта переменная объявлена так, как вы ее опубликовали? Подобно:
$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
должен сделать свое дело.
Я столкнулся с аналогичной проблемой с почтовым сервером с открытым исходным кодом. В этом случае я использовал API для отправки электронного письма с двумя получателями. API возвращает JSON, который я хочу обработать для получения идентификатора сообщения, который Индекс присвоил каждому сообщению. Строка 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
)
)
)
)
Глядя на структуру, первые несколько слоев легко извлечь. Проблема в том, что объект сообщения имеет атрибуты, названные для каждого адреса электронной почты получателя. Не зная этих значений адресов априори, я не смог бы получить программный доступ к отдельным объектам получателя, чтобы получить идентификатор сообщения.
Я также исследовал этот объект с помощью var_dump() и var_export(). Вот где я увидел этот странный и вводящий в заблуждение синтаксис: "stdClass::__set_state(array(". Но в этом объекте вообще нет массивов. В действительности эта структура содержит только вложенные объекты и атрибуты).
Эта ситуация вызывала у меня приступы, пока я не задал правильный вопрос: как называются атрибуты объекта?
Теперь программное решение относительно простое, потому что в PHP есть функция для этого. Я использовал get_object_vars(), чтобы получить массив атрибутов в объекте сообщений. Просто зацикливаясь на этом массиве, я мог получить доступ к атрибутам id и token каждого адреса. Вот код с примером ответа JSON от Postal.
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>');
Это усложнило то, что дизайн Почты использует имена переменных переменных в объекте сообщений. Я бы сделал сообщения массивом и поместил адрес электронной почты в атрибут с именем address вместе с атрибутами id и token. Но это то, что есть, и я надеюсь, что это поможет кому-то еще.