5

PHPを使用して以下のデータを解析するのに苦労しています。APIがそれを返し、私はさまざまな構文を試しました。オブジェクト以外の方法でデータを返すにはどうすればよいですか?または、stdClassを使用してデータを呼び出すための構文は何ですか?

これを1つのデータベースの配列、または2つに変換できますか?オブジェクトベースのデータセットに関しては、私は迷っています。

stdClass Object
(
    [0] => stdClass Object
        (
            [district] => stdClass Object
                (
                    [state] => NY
                    [number] => 29
                )

        )

    [1] => stdClass Object
        (
            [district] => stdClass Object
                (
                    [state] => NY
                    [number] => 26
                )

        )

)

自分でオブジェクトを作成してからvar_dumpを実行すると、次のようになります。

object(stdClass)#8 (2) {
  [0]=>
  object(stdClass)#4 (1) {
    ["district"]=>
    object(stdClass)#5 (2) {
      ["state"]=>
      string(2) "NY"
      ["number"]=>
      string(2) "29"
    }
  }
  [1]=>
  object(stdClass)#6 (1) {
    ["district"]=>
    object(stdClass)#7 (2) {
      ["state"]=>
      string(2) "NY"
      ["number"]=>
      string(2) "26"
    }
  }
}
4

6 に答える 6

14

彼らはおそらく、コード内のオブジェクトに配列をキャストしています($object = (object) $array)。これには、これから参照によって渡されるという利点があり(オブジェクトのデフォルトのように)、オブジェクトをキャストバックするまでオブジェクトが完全に役に立たないという欠点があります(メンバーは数字で始めることはできません-PHPのドキュメントの正規表現を参照してください)。 (PHPはいくつかの非常に不思議なことを許可します):

$array = (array) $bogusObject;
$array[0]->district->state === 'NY';
于 2009-10-14T17:42:40.747 に答える
10

使用する:

$object->{'0'}->district->state

基本的には、変数に文字列を割り当ててから、その変数をオブジェクトアクセサーとして使用するというショートカットです。

$zero = "0";
$object->$zero; /* or */ $object->{$zero};
于 2009-10-14T17:57:34.697 に答える
4

私は今彼らのコードを見ています、そして残念ながら、彼らはあなたが連想配列ツリー対stdClassオブジェクトツリーとしてデータを要求するために彼らのクラスのオプションを公開していません。

「問題」はclass.sunlightlabs.phpの96行目にあります

return json_decode( $data );

いくつかのオプションがあります。

  1. stdClass構​​文を使用するだけです。
  2. 返されたstdClassツリーを連想配列に変換します

#1の実行

// echo the state of the 2nd object in the result
echo $result->{0}->district->state;

#2の実行

$result = toArray( $result );

function toArray( $data )
{
  if ( is_object( $data ) )
  {
    $data = get_object_vars( $data );
  }
  return is_array($data) ? array_map(__FUNCTION__, $data) : $data;
}

パターンをクリエイティブに適用してクラスを直接操作することもできますが、サブラッカスを多用しているため、かなり複雑になっているため、これら2つのソリューションのいずれかに固執します。

于 2009-10-14T17:46:05.303 に答える
1

ユーザー「null」はコメントでこれを提案しましたが、簡単に見逃さないようにここに入れたいと思います。

最良のオプションは、json_decodeの2番目のパラメーターとしてTRUEを渡すことです。つまり、json_decode($ data、TRUE)を使用すると、クラスではなく連想配列が返されます。したがって、ソースコードにアクセスできる場合は、その変更を加えてください。

于 2010-08-23T06:20:19.893 に答える
1

次のようにオブジェクトを反復処理できます。

foreach ($obj as $each) {
    echo $each->district->state . ' - ' . $each->district->number . '<br />';
}
于 2009-10-14T17:46:17.457 に答える
0

soulmergeのこのソリューションは、私にとってはうまく機能しました。

$array = (array) $bogusObject;
$array[0]->district->state === 'NY';

どうもありがとう!!

于 2010-07-24T19:00:29.397 に答える