1

我为此搜索了很多,发现了几个类似的问题,但没有一个能完全解决我想要完成的问题。

我正在尝试编写一个代码来搜索 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 => 37325091 的值来返回“REF100019”。

我尝试过的一些事情我无法开始工作: 虽然我阅读foreachnew 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感谢菲尼克斯):

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);
4

2 回答 2

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'];
}
于 2013-07-30T16:07:36.637 回答
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 等于函数的参数。

于 2013-07-20T03:51:28.173 回答