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'];
}