PHP Parse Json из HTTP-ответа и Foreter Iterate Array

Есть несколько целенаправленных вопросов по этой теме, но, попробовав их все, я почувствовал необходимость искать помощи. Я использую Sendgrid, их webhook отправляет ответ json, и по какой-то причине я не смог понять, как интегрироваться с нашим CRM.

Обновление: 12/3/2015 @ 13:01 – У меня есть код для работы (возможно, не самый эффективный, но он работает) см. Ниже.

Пример отправки JSON из отправителя:

[ { "sg_message_id":"sendgrid_internal_message_id", "email": "john.doe@sendgrid.com", "timestamp": 1337197600, "smtp-id": "<4FB4041F.6080505@sendgrid.com>", "event": "spamreport" }, { "sg_message_id":"sendgrid_internal_message_id", "email": "john.doe@sendgrid.com", "timestamp": 1337966815, "category": "newuser", "event": "bounce", "url": "https://sendgrid.com" }, { "sg_message_id":"sendgrid_internal_message_id", "email": "john.doe@sendgrid.com", "timestamp": 1337969592, "smtp-id": "<20120525181309.C1A9B40405B3@Example-Mac.local>", "event": "unsubscribe", "asm_group_id": 42 } ] 

Проблема, с которой я сталкиваюсь, заключается в том, что каждый массив в JSON относится к определенному событию. Например, «Спам», или «Отскок» или «Отменить подписку». Я настроил его так, чтобы были отправлены только те три события. Однако есть вероятность, что кто-то сначала подпрыгнет, затем получит его, затем ударит спам, а затем отменит подписку.

Самое простое решение для этого (без учета системы иерархии) заключается в том, чтобы каждое из этих событий проходило в определенной области нашего CRM. Например, если событие = спам, то оно будет заполнять спам «спамом». Однако, если его нет, он ничего не должен делать.

Последнее замечание, я должен передать заголовок так, чтобы Sendgrid прекратил рассылку сценария. Кроме того, я не кодер, или программист, за последние несколько месяцев я просто взял несколько вещей.

Мой скрипт, который не работает:

  <?php $data = file_get_contents("php://input"); $events = json_decode($data, true); require_once('Infusionsoft/infusionsoft.php'); $contact = new Infusionsoft_Contact(); $custom = array( '_SGBounce', '_SGSpam', '_SGUnsub' ); $contact->addCustomFields($custom); if (is_array($events) || $events instanceof Traversable) { foreach ($events as $event) { $email = $event['email']; if($event['event'] === 'bounce') { $bounce = 'bounce'; } elseif ($event['event'] === 'spamreport') { $spam = 'spam'; } elseif ($event['event'] === 'unsubscribe') { $unsub = 'unsubscribe'; } else { die echo header("HTTP/1.1 200 OK"); } process_event($event); }} if (empty($email)) { die echo header("HTTP/1.1 200 OK"); } else { $contact->Email = $email; $contact->_SGBounce = $bounce; $contact->_SGSpam = $spam; $contact->_SGUnsub = $unsub; $contact->save(); } header("HTTP/1.1 200 OK"); ?> под  <?php $data = file_get_contents("php://input"); $events = json_decode($data, true); require_once('Infusionsoft/infusionsoft.php'); $contact = new Infusionsoft_Contact(); $custom = array( '_SGBounce', '_SGSpam', '_SGUnsub' ); $contact->addCustomFields($custom); if (is_array($events) || $events instanceof Traversable) { foreach ($events as $event) { $email = $event['email']; if($event['event'] === 'bounce') { $bounce = 'bounce'; } elseif ($event['event'] === 'spamreport') { $spam = 'spam'; } elseif ($event['event'] === 'unsubscribe') { $unsub = 'unsubscribe'; } else { die echo header("HTTP/1.1 200 OK"); } process_event($event); }} if (empty($email)) { die echo header("HTTP/1.1 200 OK"); } else { $contact->Email = $email; $contact->_SGBounce = $bounce; $contact->_SGSpam = $spam; $contact->_SGUnsub = $unsub; $contact->save(); } header("HTTP/1.1 200 OK"); ?> 

У меня также есть сценарий, который я использую, который записывает в файл, просто чтобы проверить и посмотреть, могу ли я получить правильные события для записи. Однако мне не удалось получить его, чтобы пройти через первый массив. Я попытался вложить foreach () в другой foreach () с помощью ключевого решения = value, размещенного в другом ответе здесь. Однако это тоже был тупик.

Любые советы, помощь и руководство … были бы очень благодарны.

Обновление: рабочий код ниже (в случае, если это помогает кому-то)

 <?php $data = file_get_contents("php://input"); $events = json_decode($data, true); require_once('Infusionsoft/infusionsoft.php'); $contact = new Infusionsoft_Contact(); $custom = array( '_SendGrid', ); $contact->addCustomFields($custom); $emails = array(); $em = ''; if (is_array($events) || $events instanceof Traversable) { foreach ($events as $event) { $email = $event['email']; $em = $email; if($event['event'] === 'unsubscribe') { $event = 'unsubscribe'; $unsubscribe = 'unsubscribe'; } elseif($event['event'] === 'spamreport') { $event = 'spam'; $spam = 'spam'; } elseif($event['event'] === 'bounce') { $event = 'bounce'; $bounce = 'bounce'; } else { continue; } $default = array( 'bounce' => false, 'spam' => false, 'unsubscribe' => false ); if(!is_null($event)) { if(array_key_exists($email, $emails)) { $entry = $emails[$email]; } else { $entry = $default; } switch($event) { case "bounce": $entry['bounce'] = true; break; case "spam": $entry['spam'] = true; break; case "unsubscribe": $entry['unsubscribe'] = true; break; } } }} if($unsubscribe === 'unsubscribe'){ $param = 'unsubscribe'; } elseif($spam === 'spam'){ $param = 'spam'; } elseif($bounce === 'bounce'){ $param = 'bounce'; } else { echo header("HTTP/1.1 200 OK"); } $contact->Email = $em; $contact->_SendGrid = $param; $contact->save(); header("HTTP/1.1 200 OK"); ?> под <?php $data = file_get_contents("php://input"); $events = json_decode($data, true); require_once('Infusionsoft/infusionsoft.php'); $contact = new Infusionsoft_Contact(); $custom = array( '_SendGrid', ); $contact->addCustomFields($custom); $emails = array(); $em = ''; if (is_array($events) || $events instanceof Traversable) { foreach ($events as $event) { $email = $event['email']; $em = $email; if($event['event'] === 'unsubscribe') { $event = 'unsubscribe'; $unsubscribe = 'unsubscribe'; } elseif($event['event'] === 'spamreport') { $event = 'spam'; $spam = 'spam'; } elseif($event['event'] === 'bounce') { $event = 'bounce'; $bounce = 'bounce'; } else { continue; } $default = array( 'bounce' => false, 'spam' => false, 'unsubscribe' => false ); if(!is_null($event)) { if(array_key_exists($email, $emails)) { $entry = $emails[$email]; } else { $entry = $default; } switch($event) { case "bounce": $entry['bounce'] = true; break; case "spam": $entry['spam'] = true; break; case "unsubscribe": $entry['unsubscribe'] = true; break; } } }} if($unsubscribe === 'unsubscribe'){ $param = 'unsubscribe'; } elseif($spam === 'spam'){ $param = 'spam'; } elseif($bounce === 'bounce'){ $param = 'bounce'; } else { echo header("HTTP/1.1 200 OK"); } $contact->Email = $em; $contact->_SendGrid = $param; $contact->save(); header("HTTP/1.1 200 OK"); ?> 

То, что вы могли бы сделать, – это так:

 $emails = array(); foreach ($events as $event) { $email = $event['email']; if($event['event'] === 'bounce') { $event = 'bounce'; } elseif ($event['event'] === 'spamreport') { $event = 'spam'; } elseif ($event['event'] === 'unsubscribe') { $event = 'unsubscribe'; } else { continue; } // Set defaults $default = array( 'bounce' => false, 'spam' => false, 'unsubscribe' => false ); if(!is_null($event)) { if(array_key_exists($email, $emails)) { $entry = $emails[$email]; } else { $entry = $default; } switch($event) { case "bounce": $entry['bounce'] = true; break; case "spam": $entry['spam'] = true; break; case "unsubscribe": $entry['unsubscribe'] = true; break; } } } 

Затем вы получите список электронных писем, которые являются их собственным массивом с булевыми значениями для bounce клавиш, spam и unsubscribe . Вы можете сделать цикл над этим массивом, чтобы сохранить данные.