PHP - поиск значения ключа, а затем поиск значения другого ключа в том же массиве объектов

Я много искал для этого и нашел несколько похожих вопросов, но ни один из них не решает полностью то, чего я пытаюсь достичь.

Я пытаюсь написать код, который будет искать многомерный массив PHP (multi), чтобы увидеть, какой подмассив содержит уникальное значение ключа, которое у меня есть. Затем я хотел бы, чтобы он возвращал значение другого ключа в том же массиве объектов.

$Arraytosearch = Array(
.
//various other subarrays
.
[fields] => Array (
    .
    .
    .
    //I don't know the number of the object subarray

   [x] => PodioTextItemField Object (  
      [__attributes] => Array ( 
        [field_id] => 37325091 
        [type] => text 
        [external_id] => id 
        [label] => ID 
        [values] => Array ( 
            [0] => Array ( 
                [value] => REF100019 ) ) 

        [config] => Array ( 
            [description] => [settings] => Array ( 
                [size] => small ) 
            [required] => [mapping] => [label] => ID [visible] => 1 [delta] => 2 ) )
    .
    .
    .
     //(and so on)

Я хотел бы написать функцию, которая будет возвращать "REF100019", указав значение field_id => 37325091.

Некоторые вещи, которые я пробовал, я не мог добраться до работы:foreachа также new RecursiveIterator хотя учебники, которые я прочитал, не пригодились для моего случая здесь.

Хотя массив выглядит сложным, я думаю, что это будет легко, так как у меня уже есть идентификатор поля родительского массива.

Заранее спасибо за любые руководства или примеры кодов, которые будут работать!

Предыстория: это часть ответа, который я получаю от Podio после отправки запроса в их API. Я просто не знаю, как получить этот ответ и получить нужный мне фрагмент (идентификатор), чтобы я мог передать его пользователям).

РЕДАКТИРОВАТЬ: Спасибо Orangepill и Barmar за поддержку. Я попробовал твой код. Но получал ошибку, которая заставила меня понять, что я не дал вам полный массив. Я выяснил, как получить ответ Podio для отображения в более удобочитаемом формате (я читал полный ответ JSON раньше из файла отладки Podio, который был очень запутанным), и выяснил, что весь массив на самом деле структурирован, как я показал ниже,

Затем я взял ваш код и смог выяснить, как заставить его работать в моем сценарии (см. Ниже). Я очень горжусь собой, учитывая, что никогда раньше не писал никакого кода, но я не смог бы сделать это без вашей помощи! Еще раз спасибо!

$Arraytosearch = Array(
  [items] => Array(
       [0] => PodioItem Object(
              [_attributes] => Array(
                      [fields] => Array (
                            [x] => PodioTextItemField Object (  
                                  [__attributes] => Array( 
                                         [field_id] => 37325091 
                                         [values] => Array( 
                                                [0] => Array( 
                                                     [value] => REF100019 ) ) 

Примечание. Для тех, кто не знаком с программированием, как я, и хочет, чтобы ответ Podio (или любая строка JSON) отображался в "довольно" читаемом формате, как описано выше, используйте код (из " Показать массив в читаемом / иерархическом формате" благодаря Phenex):

print "<pre>";
print_r($Arraytoformat);
print "</pre>";

И, наконец, полный код, который я использовал (используя ответ Orangepill ниже), который ищет объекты и массивы и дает мне то, что я искал в течение нескольких дней, выглядит следующим образом:

$Arraytosearch = PodioItem::filter(APP_ID, $filterParams);
$fieldID = 37325091;    

    function getFirstValueByFieldId($fieldId, $Arraytosearch){
      foreach($Arraytosearch["items"][0]->__attributes["fields"] as $textitem){
        if ($textitem->__attributes["field_id"] == $fieldId){
        return $textitem->__attributes["values"][0]["value"];
    }}}

$refID = getFirstValueByFieldId($fieldID, $Arraytosearch);

2 ответа

Решение

Есть много способов снять шкуру с этой кошки... это, пожалуй, самый прямой

function getFirstValueByFieldId($fieldId, $Arraytosearch){
    foreach($Arraytosearch["fields"] as $textitem){
        if ($textitem->__attributes["field_id"] == $fieldId){
            return $textitems->__attributes["values"][0]["value"];

        }
    }   
}

Использовать в вашем случае будет

echo getFirstValueByFieldId("37325091", $Arraytosearch);

По сути, он обходит элементы в массиве fields и возвращает значение в первом связанном значении в массиве values, где field_id равен параметру функции.

Библиотека podio-php имеет встроенные методы, которые обрабатывают все это для вас. Нет необходимости связываться со свойством __attributes самостоятельно.

Вы можете увидеть несколько примеров на https://github.com/podio/podio-php/blob/master/examples/items.php

В твоем случае:

// Get item collection
$itemCollection = PodioItem::filter(APP_ID, $filterParams);
$fieldID = 37325091;

foreach ($itemCollection['items'] as $item) {
  // Get the field from the item
  $field = $item->field($fieldID);
  // Now you can print the value of that field
  print $field->humanized_value;
  // Or if you don't want to have the content sanitized:
  print $field->values[0]['value'];
}
Другие вопросы по тегам