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 が既にあるので簡単だと思います。

動作するガイダンスまたはサンプルコードを事前にありがとうございます!

背景: これは、Podio の 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 文字列) を上記のような「きれいな」読み取り可能な形式で表示したい場合は、次のコードを使用します (読み取り可能な/階層形式で配列を表示するのおかげでフェネックス):

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 に答える