Как получить значение родительского элемента массива php зная одно из значений его дочернего массива?

Недавно оставлял вопрос о том как получить ид контакта зная его номер телефона в AmoCrm при помощи api.
Разобрался как получить список всех контактов.
При отправке запроса на https://'.$subdomain.'.amocrm.ru/private/api/v2/json/contacts/list возвращается следующее:

Пожалуйста, помогите вытащить значение того поля id, чей номер телефона совпадает с известным (получаем из формы).
(+3 (333) 333-33-33 - номер телефона)

нижеприведенный код - распечатка json (подсказка пользователя Fesor);
$out=curl_exec($curl);
print_r($out;)

{
  "response":  {
    "contacts":  [
       {
        "id": 50824019,
        "name": "Zecuch",
        "last_modified": 1413915416,
        "account_id": 7975286,
        "date_create": 1413915415,
        "created_user_id": 294474,
        "responsible_user_id": 294474,
        "linked_leads_id":  [],
        "group_id": 0,
        "tags":  [],
        "company_name": "",
        "linked_company_id": null,
        "type": "contact",
        "custom_fields":  [
           {
            "id": "1279390",
            "name": "Email",
            "code": "EMAIL",
            "values":  [
               {
                "value": "zecuch@re.de",
                "enum": "2942838"
              }
            ]
          },
           {
            "id": "1279388",
            "name": "Телефон",
            "code": "PHONE",
            "values":  [
               {
                "value": "+3 (333) 333-33-34",
                "enum": "2942836"
              }
            ]
          }
        ]
      },
       {
        "id": 50824011,
        "name": "Ястр",
        "last_modified": 1413915437,
        "account_id": 7975286,
        "date_create": 1413915319,
        "created_user_id": 294474,
        "responsible_user_id": 294474,
        "linked_leads_id":  [],
        "group_id": 0,
        "tags":  [],
        "company_name": "",
        "linked_company_id": null,
        "type": "contact",
        "custom_fields":  [
           {
            "id": "1279390",
            "name": "Email",
            "code": "EMAIL",
            "values":  [
               {
                "value": "yaswar@ya.ru",
                "enum": "2942838"
              }
            ]
          },
           {
            "id": "1279388",
            "name": "Телефон",
            "code": "PHONE",
            "values":  [
               {
                "value": "+3 (333) 333-33-33",
                "enum": "2942836"
              }
            ]
          }
        ]
      }
    ],
    "server_time": 1413922440
  }
}
  • Вопрос задан
  • 3581 просмотр
Решения вопроса 1
vserykh
@vserykh
Разработка сайтов, лендингов «под ключ»
Как сказано в документации, в запросе можно использовать параметр «query», который позволяет искать по значениям полей.

Если в качестве значения этого параметра указать искомый номер телефона, то в выдаваемом списке контактов будут только те контакты, у которых этот номер телефон присутствует в одном из полей.
4a0a048538f240e8a2e8dd65e847a74b.PNG
К сожалению, видимо, используется только точное вхождение: если искомый телефон будет записан без скобок или пробелов — найдено ничего не будет.

Хотя, если по своим правилам нормализовывать номера телефонов при записи в CRM, то можно будет искать.
1a7b952f93a941c3a2978436e8d5be4d.PNG
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
function array_some(array $collection, $search) {
    $filtered = array_filter($collection, $search);

    return empty($filtered) ? null : $filtered[0];
}

function find_contact(array $collection, $phone) {
   return array_some($collection,  function ($contact) use ($phone) {
     return null !== array_some($contact['custom_fields'], function($field) use ($phone) {
        return $field['code'] === 'PHONE' 
            && null !== some($field['values'], function ($value) use ($phone) {
                   return $value['value'] === $phone;
             });
  });
});
}

$response = json_decode($jsonResponse, true);
$contact = findContact($response['response'], '+3 (333) 333-33-33');


или же втупую циклом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы