web-dev-qa-db-ja.com

配列/オブジェクトにアクセスするにはどうすればよいですか?

次の配列があり、print_r(array_values($get_user));を実行すると、次のようになります。

Array (
          [0] => 10499478683521864
          [1] => 07/22/1983
          [2] => [email protected]
          [3] => Alan [4] => male
          [5] => Malmsteen
          [6] => https://www.facebook.com  app_scoped_user_id/1049213468352864/
          [7] => stdClass Object (
                   [id] => 102173722491792
                   [name] => Jakarta, Indonesia
          )
          [8] => id_ID
          [9] => El-nino
          [10] => Alan El-nino Malmsteen
          [11] => 7
          [12] => 2015-05-28T04:09:50+0000
          [13] => 1
        ) 

私は次のように配列にアクセスしようとしました:

echo $get_user[0];

しかし、これは私を表示します:

未定義0

注:

この配列はFacebook SDK 4から取得するため、元の配列構造はわかりません。

例として、配列から[email protected]の値にアクセスするにはどうすればよいですか?

58

arrayまたはobjectにアクセスするには、2つの異なる演算子を使用します。

配列

配列要素にアクセスするには、[]を使用するか、あまり表示されませんが、{}を使用する必要があります。

echo $array[0];
echo $array{0};
//Both are equivalent and interchangeable

配列の宣言と配列要素へのアクセスの違い

配列の定義と配列要素へのアクセスは、2つの異なるものです。混同しないでください。

配列を定義するには、array()を使用するか、PHP> = 5.4 []に使用して、配列/要素を割り当て/設定します。上記のように[]または{}で配列要素にアクセスしているとき、要素を設定するのではなく、配列要素の値を取得します。

//宣言する 配列
 $ arrayA = 配列( / *ここにあるもの* / ; 
 $ arrayB = [ / *ここにあるもの* / ]// PHP> = 5.4のみ
 
 //アクセス中 配列要素
 echo $ array[]; 
 echo $ array{}; 

アクセス配列要素

配列内の特定の要素にアクセスするには、[]または{}内の任意の式を使用して、アクセスしたいキーを評価できます。

$ array [(任意の表現)] 

したがって、キーとして使用する式と、PHPでどのように解釈されるかを認識してください。

echo $ array []; //キーは 整数; 0の要素にアクセスします。
 echo $ array [「0」]; //キーは ひも; 0の要素にアクセスします。
 echo $ array [「ひも」]; //キーは ひも;キー 'string' 
 echo $ array [定数]; //キーは 定数 そして、対応する値に置き換えられます
 echo $ array [定数]; //キーも 定数 文字列ではない
 echo $ array [$ anyVariable] //キーは 変数 '$ anyVariable' 
 echo $ array [にある値に置き換えられます。functionXY()]; //キーは 戻り値 関数の

多次元配列にアクセスする

互いに複数の配列がある場合は、単に多次元配列があります。サブ配列の配列要素にアクセスするには、複数の[]を使用するだけです。

echo $array["firstSubArray"]["SecondSubArray"]["ElementFromTheSecondSubArray"]
         // ├─────────────┘  ├──────────────┘  ├────────────────────────────┘
         // │                │                 └── 3rd Array dimension;
         // │                └──────────────────── 2d  Array dimension;
         // └───────────────────────────────────── 1st Array dimension;

オブジェクト

オブジェクトプロパティにアクセスするには、->を使用する必要があります。

エコー$ object->プロパティ; 

別のオブジェクトにオブジェクトがある場合は、複数の->を使用してオブジェクトプロパティを取得するだけです。

echo $objectA->objectB->property;

注:

  1. また、無効なプロパティ名がある場合は注意する必要があります!したがって、無効なプロパティ名に直面する可能性があるすべての問題を確認するには、これを参照してください question/answer 。そして特に this one プロパティ名の先頭に数字がある場合。

  2. プロパティには、クラスの外部からpublic visibility でのみアクセスできます。それ以外の場合(プライベートまたは保護)、プロパティまたは値を取得するために使用できるメソッドまたはリフレクションが必要です。

配列とオブジェクト

配列とオブジェクトが混在している場合、配列要素またはオブジェクトプロパティにアクセスして、対応する演算子を使用するかどうかを確認するだけです。

//Object
echo $ object-> anotherObject-> propertyArray ["elementOneWithAnObject"]-> property; 
 //├────┘├─────────── ─┘├───────────┘├──────────────────────┘├──────┘
 //││││└──プロパティ; 
 //│││└─────────────────────────────配列要素(オブジェクト);つかいます -> プロパティ「プロパティ」にアクセスするには
 //││└─────────────────────────────────── ──────────配列(プロパティ);つかいます [] 配列要素 'elementOneWithAnObject' 
にアクセスするには//│└────────────────────────────────── ─────────────────────────プロパティ(オブジェクト);つかいます -> プロパティ 'propertyArray' 
にアクセスするには//└───────────────────────────────────── ───────────────────────────────オブジェクト;つかいます -> プロパティ「anotherObject」
 
 
 // Array 
 echo $ array ["arrayElement"] ["anotherElement"]-> object-> property [にアクセスするには"element"]; 
 //├───┘├────────────┘├──────────────┘├── ──┘├──────┘┘───────┘
 //│││││└──配列要素; 
 //││││└───────────property(array);つかいます [] 配列要素 'element' 
にアクセスするには//│││└────────────────────property(object);つかいます -> プロパティ 'property' 
にアクセスするには//││└─────────────────────────────────── ─────配列要素(オブジェクト);つかいます -> プロパティ 'object' 
にアクセスするには//│└───────────────────────────────────── ────────────────────配列要素(配列);つかいます [] 配列要素「anotherElement」
にアクセスするには//└──────────────────────────────────── ───────────────────────────配列;つかいます [] 配列要素「arrayElement」
 
にアクセスするには

これにより、配列とオブジェクトが互いに入れ子になっている場合に、それらにアクセスする方法の大まかなアイデアが得られることを願っています。

注:

  1. 配列またはオブジェクトと呼ばれる場合、変数の最も外側の部分に依存します。 [new StdClass]は、内部に(ネストされた)オブジェクトがある場合でもarrayであり、$object->property = array();object even内部に(ネストされた)配列がある場合。

    オブジェクトまたは配列があるかどうか不明な場合は、単に gettype() を使用してください。

  1. 誰かがあなた以外のコーディングスタイルを使用している場合でも、混乱しないでください。

    //Both methods/styles work and access the same data
    echo $object->anotherObject->propertyArray["elementOneWithAnObject"]->property;
    echo $object->
            anotherObject
            ->propertyArray
            ["elementOneWithAnObject"]->
            property;
    
    //Both methods/styles work and access the same data
    echo $array["arrayElement"]["anotherElement"]->object->property["element"];
    echo $array["arrayElement"]
         ["anotherElement"]->
             object
       ->property["element"];
    

配列、オブジェクト、ループ

単一の要素にアクセスしたくない場合は、ネストされた配列/オブジェクトをループして、特定の次元の値を確認できます。

このためには、ループするディメンションにアクセスするだけで、そのディメンションのすべての値をループできます。

例として配列を使用しますが、オブジェクトにすることもできます。

Array (
    [data] => Array (
            [0] => stdClass Object (
                    [propertyXY] => 1
                )    
            [1] => stdClass Object (
                    [propertyXY] => 2
                )   
            [2] => stdClass Object (
                    [propertyXY] => 3                   
               )    
        )
)

最初のディメンションをループすると、最初のディメンションからすべての値が取得されます。

foreach($ array as $ key => $ value)

ここで、最初の次元では、key($keydataおよびvalue($value)を持つ要素は1つしかありません。

Array (  //Key: array
    [0] => stdClass Object (
            [propertyXY] => 1
        )
    [1] => stdClass Object (
            [propertyXY] => 2
        )
    [2] => stdClass Object (
            [propertyXY] => 3
        )
)

2番目の次元をループすると、2番目の次元からすべての値が取得されます。

foreach($ array ["data"] as $ key => $ value)

2番目の次元では、キー($key012、および値($value)を持つ3つの要素があります。

stdClass Object (  //Key: 0
    [propertyXY] => 1
)
stdClass Object (  //Key: 1
    [propertyXY] => 2
)
stdClass Object (  //Key: 2
    [propertyXY] => 3
)

これにより、配列またはオブジェクトに関係なく、必要な任意の次元をループできます。

分析 var_dump() / print_r() / var_export() 出力

これらの3つのデバッグ関数はすべて、同じデータを、別の形式で、または何らかのメタデータ(たとえば、タイプ、サイズ)とともに出力します。したがって、ここでは、これらの関数の出力を読み取って、配列/オブジェクトから特定のデータにアクセスする方法を知る/取得する方法を示したいと思います。

入力配列:

$array = [
    "key" => (object) [
        "property" => [1,2,3]
    ]
];

var_dump()出力:

array(1) {
  ["key"]=>
  object(stdClass)#1 (1) {
    ["property"]=>
    array(3) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      int(3)
    }
  }
}

print_r()出力:

Array
(
    [key] => stdClass Object
        (
            [property] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                )

        )

)

var_export()出力:

array (
  'key' => 
  stdClass::__set_state(array(
     'property' => 
    array (
      0 => 1,
      1 => 2,
      2 => 3,
    ),
  )),
)

あなたが見ることができるように、すべての出力はかなり似ています。そして、値2にアクセスしたい場合は、値自体から開始することができます。値自体にアクセスして、「左上」への道を進みます。

1.最初に、値2がキー1の配列にあることがわかります

array(3){  //var_dump()
 [0] => 
 int(1)
 [1] => 
 int(2)
 [2] => 
 int(3)
}
アレイ  //print_r()
(
 [0] => 1 
 [1] => 2
 [2] => 3 
配列(  //var_export()
 0 => 1、
 1 => 2
 2 => 3、
)、

つまり、値にはキー/インデックス1があるため、[]で値2にアクセスするには、{}/[1]を使用する必要があります。

2.次に、オブジェクトのnameプロパティを持つプロパティに配列が割り当てられていることがわかります

対象(stdClass)#1(1) {  //var_dump()
 [「プロパティ」]=> 
/*ここに配列*/
}
stdClass 対象  //print_r()
[プロパティ] =>/*ここに配列*/
stdClass:: __ set_statearray(//var_export()
 「プロパティ」 => 
/*ここに配列*/
))、

これは、オブジェクトのプロパティにアクセスするために->を使用する必要があることを意味します。 ->property

これまでのところ、->property[1]を使用する必要があることがわかっています。

3.そして最後に、一番外側が配列であることがわかります

array(1){  //var_dump()
 ["キー"]=> 
/*ここにオブジェクトと配列*/
}
アレイ  //print_r()
[キー] => 
/*ここにオブジェクトと配列*/
配列(  //var_export()
 'キー' => 
/*ここにオブジェクトと配列*/

[]を使用して配列要素にアクセスする必要があることがわかっているので、オブジェクトにアクセスするには["key"]を使用する必要があることがわかります。これで、これらのすべての部分をまとめて記述できます。

echo $array["key"]->property[1];

出力は次のようになります。

2

PHPにだまされてはいけません!

知っておくべきことがいくつかあるので、それらを見つけるのに何時間も費やさないようにします。

  1. 「非表示」文字

    キーに文字が含まれていることがありますが、ブラウザの最初の外観では表示されません。そして、あなたは、なぜあなたが要素にアクセスできないのかを自問しています。これらの文字には、タブ(\t)、改行(\n)、スペースまたはhtmlタグ(</p><b>など)などがあります。

    例としてprint_r()の出力を見ると、次のように見えます:

    Array ( [key] => HERE ) 
    

    次に、次のもので要素にアクセスしようとしています:

    echo $arr["key"];
    

    しかし、あなたは通知を受け取っています:

    Notice:未定義のインデックス:キー

    これは、キーがかなり正しいように見えても、要素にアクセスできないため、いくつかの隠された文字が存在する必要があることを示しています。

    ここでのコツは、var_dump()を使用してソースコードを調べることです! (代替:highlight_string(print_r($variable, TRUE));

    突然、次のようなものが表示されます。

    array(1) {
      ["</b>
    key"]=>
      string(4) "HERE"
    }
    

    これで、キーにhtmlタグと改行文字が含まれていることがわかります。print_r()とブラウザはそれを表示しなかったため、最初は見ませんでした。

    だから今しようとすると:

    echo $arr["</b>\nkey"];
    

    目的の出力が得られます。

    HERE
    
  2. XMLを見る場合は、print_r()またはvar_dump()の出力を信頼しないでください

    XMLファイルまたは文字列がオブジェクトに読み込まれている場合があります。

    <?xml version="1.0" encoding="UTF-8" ?> 
    <rss> 
        <item> 
            <title attribute="xy" ab="xy">test</title> 
        </item> 
    </rss>
    

    ここでvar_dump()またはprint_r()を使用すると、次のように表示されます。

    SimpleXMLElement Object
    (
        [item] => SimpleXMLElement Object
        (
            [title] => test
        )
    
    )
    

    ご覧のとおり、タイトルの属性は表示されません。したがって、XMLオブジェクトがある場合は、var_dump()またはprint_r()の出力を絶対に信頼しないでください。完全なXMLファイル/文字列を表示するには、常に asXML() を使用します。

    したがって、以下に示す方法のいずれかを使用してください。

    echo $xml->asXML();  //And look into the source code
    
    highlight_string($xml->asXML());
    
    header ("Content-Type:text/xml");
    echo $xml->asXML();
    

    そして、出力が得られます:

    <?xml version="1.0" encoding="UTF-8"?>
    <rss> 
        <item> 
            <title attribute="xy" ab="xy">test</title> 
        </item> 
    </rss>
    

詳細については、以下を参照してください。

一般(記号、エラー)

プロパティ名の問題

91
Rizier123

この質問から、入力配列の構造がわかりません。多分array ('id' => 10499478683521864, 'date' => '07/22/1983')。したがって、$ demo [0]を要求するときは、undefindインデックスを使用します。

Array_valuesはキーを失い、array(10499478683521864, '07/22/1983'...)として配列を作成する多数のキーを持つ配列を返します。この結果は質問にあります。

したがって、同じ方法で配列項目の値を取得できます

echo array_values($get_user)[0]; // 10499478683521864 
8
splash58

print_r($var)からの出力が例の場合:

    Array ( [demo] => Array ( [0] => 10499478683521864 [1] => 07/22/1983 [2] => [email protected] ) )

次に$var['demo'][0]を実行します

print_r($var)からの出力が例の場合:

    Array ( [0] => 10499478683521864 [1] => 07/22/1983 [2] => [email protected] )

次に$var[0]を実行します

2
Evans Murithi