Как получить доступ к членам этих данных в PHP?

StackOverflow https://stackoverflow.com/questions/2657055

  •  27-09-2019
  •  | 
  •  

Вопрос

Хорошо. Теперь я сдаюсь. Я играю с этим часами.

  • У меня есть имя переменной $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); Но все, что я получаю, это

НУЛЕВОЙ

Это было полезно?

Решение

Это переменная объявлен Как вы разместили это? Нравиться:

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

В этом случае я не совсем уверен, как вы можете получить доступ 'headers' через $data->headers. Отказ Должен быть $data['headers'], Потому что это массив, а не объект.

Дальше, stdClass::__set_state(array('headers' => …)) статически вызывает метод __set_state класса stdClass. Отказ Независимо от этого метода я не знаю, но только его возвращаемое значение будет назначено на 'parts' => array(0 => ...) ключ.

Если ОТО на то, что вы показываете, является результатом var_dump($data), тогда это неверная ерунда, так как stdClass::__set_state() никогда не появится в var_dump. Отказ Что-то рыбное либо в вашем коде, либо в том, что вы опубликовали, и трудно сказать, не увидев больше этого.

Игнорировать выше, var_export Распечатывает классы это приконно.

$data['headers'] должен сделать это для первых заголовков. Дальше, $data['parts'][0]->headers должен сделать трюк.

Другие советы

Я столкнулся с аналогичной проблемой с почтовым сервером Open-Source Почтовый. Отказ В этом случае я использовал API для отправки сообщения электронной почты двумя получателями. API возвращает JSON, что я хочу обработать, чтобы получить идентификатор сообщения Postal назначен каждому сообщению. Строка 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
                        )

                )

        )

)

Глядя на структуру, первые несколько слоев легко извлечь. Беда в том, что объект сообщений имеет атрибуты, названные для каждого адреса электронной почты получателя. Не зная эти адресные значения A априори, я не мог получить доступ к индивидуальным объектам получателя программно, чтобы получить в идентификаторе сообщения.

Я также изучил этот объект, используя var_dump () и var_export (). Вот где я видел этот странный и вводящий в заблуждение синтаксиса: «STDClass :: __ Set_State (Array (». Но вообще нет массивов в этом объекте. На самом деле эта структура не содержит ничего, кроме как вложенных объектов и атрибутов.

Эта ситуация дала мне подходящие, пока я не спросил правильный вопрос: каковы имена атрибутов объекта?

Теперь программное решение относительно легко, потому что PHP имеет функцию для этого. Я использовал get_object_vars (), чтобы получить массив атрибутов в объекте сообщений. Просто связываясь на этом массиве, я мог бы получить доступ к атрибутам идентификатора и токена каждого адреса. Вот код, с образцом ответа 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>');

Что это было тяжело, это то, что почтовый дизайн использует имена переменных атрибутов в объекте сообщений. Я бы сделал сообщения массивом и поместил адрес электронной почты в атрибут с именем адрес, а также идентификатор атрибутов и токеном. Но это то, что есть, и я надеюсь, что это поможет кому-то еще.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top