我为此搜索了很多,发现了几个类似的问题,但没有一个能解决我想要完成的事情。
我正在尝试编写一个代码来搜索PHP(多)多维数组,以查看哪个子数组包含我拥有的唯一键值。然后我希望它返回同一个对象子数组中不同键的值。
$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)
我想通过提供field_id =>的值来编写一个返回“REF100019”的函数。 37325091
我尝试过的一些我无法上班的事情:
foreach
和new RecursiveIterator
虽然我读到的教程对我的案例没用。
即使数组看起来很复杂,我认为这很容易,因为我已经有了父数组的字段id。
提前感谢您提供有用的指导或示例代码!
背景:这是我在向API提交请求后从Podio获得的响应的一部分。我只是不知道如何获取该响应并得到我需要的部分(ID),以便我可以为用户回应它。
编辑:感谢Orangepill和Barmar的支持。我试过你的代码。但是得到了一个错误,这让我意识到我没有给你完整的阵列。我想出了如何让Podio响应以更易读的格式显示(我之前从Podio调试文件中读取了完整的JSON响应,这非常令人困惑),并且发现完整的数组实际上是按照我在下面显示的结构。然后我接受了你的代码并且能够弄清楚如何让它适用于我的场景(见下文)。我很自豪,因为我以前从未写过任何代码,但没有你的帮助,我无法做到!再次感谢!
$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字符串)以上述“漂亮”可读格式显示的人,请使用代码(来自Display an array in a readable/hierarchical format感谢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);
答案 0 :(得分:2)
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'];
}
答案 1 :(得分:0)
有很多方法可以让这只猫受伤......这可能是最直接的
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等于函数的参数。