2016-12-13 6 views
0

私はAPIがそうのような数値配列を含むオブジェクト内の複数のレコードを返しているシナリオを持っているため、オブジェクトを変更します。PHP - 一貫性

stdClass Object 
(
    [Event] => Array 
     (
      [0] => stdClass Object 
       (
        [ID] => 111 
        [Name] => My First Event 
        [EventType] => stdClass Object 
         (
          [ID] => 1 
          [Category] => Music 
         ) 
       ) 

      [1] => stdClass Object 
       (
        [ID] => 222 
        [Name] => My Second Event 
        [EventType] => stdClass Object 
         (
          [ID] => 2 
          [Category] => Sport 
         ) 
       ) 
     ) 

    [Errors] => stdClass Object 
     (
      [Result] => 0 
      [Message] => 
     ) 

    [RecordCount] => 2 
) 

私は現在、レコードを反復処理するためにforeachループを使用しています。これは正常に動作します。

foreach($result->Event as $Event) 

しかし、私はここで問題が発生します。その場合、単一の結果がオブジェクトに返されます。

stdClass Object 
(
    [Event] => stdClass Object 
     (
      [ID] => 11 
      [Name] => My Only Event 
      [EventType] => stdClass Object 
       (
        [ID] => 2 
        [Category] => Sport 
       ) 

     ) 

    [Errors] => stdClass Object 
     (
      [Result] => 0 
      [Message] => 
     ) 

    [RecordCount] => 1 
) 

単一の結果の配列インデックスはありません。

私はAPIによって返されるデータの制御することはできません念頭に置いて、この保持を克服するための最良の方法は何ですか?

+2

Iは[IS_ARRAY()](http://php.net/is_array)と推定します。 –

+0

もし配列があるかどうかに依存して2つのロジックを別々にする必要がある場合、それはかなり乱雑になる可能性があります。 – Sam

+2

その後、APIオーナーに苦情を申し立てます(私はそのデザインが嫌いです)。 –

答えて

0

私が見つけた最高の回避策は、結果オブジェクト内のゼロインデックスを持つ配列に単一のイベントを追加することです。このように、結果オブジェクトは、複数のレコードを含む結果と同じ構造に一致します。

if(!is_array($result->Event)){ 
    $result->Event = array($result->Event); 
} 
+0

Eventが配列ではないかどうかをチェックするためにこれを編集しました。 API所有者が配列として単一のレコードを返すアプローチを変更した場合、これは無視されます。 – Sam

0

チェックEventが配列またはオブジェクト

if(is_object($result->Event)) 
{ 
    // ... 
} 
else 
{ 
    foreach(// [....] 
} 

ある場合は、オブジェクトを処理することができるか、Sam

ところで

により示唆されるように1つの項目の配列で上書き:非常に悪いAPIデザイン。私は不満になる....