1. ホーム
  2. php

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

2023-08-13 12:39:58

質問

以下のような配列があるのですが、これを 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] のような値にアクセスするにはどうしたらよいでしょうか?

どのように解決するのですか?

へのアクセスは array または object のように、2つの異なる演算子を使用する方法について説明します。

配列

配列の要素にアクセスするには [] .

echo $array[0];

古いバージョンの PHP では、代替構文として {} を使った代替構文も許可されていました。

echo $array{0};

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

配列の定義と配列要素へのアクセスは、異なるものです。ですから、混同しないようにしましょう。

配列を定義するには array() または、PHP >=5.4では [] というように、配列/要素を代入/設定します。一方、配列要素にアクセスする際に [] でアクセスする場合は、要素を設定するのではなく、配列要素の値を取得します。

//Declaring an array
$arrayA = array ( /*Some stuff in here*/ );
$arrayB = [ /*Some stuff in here*/ ]; //Only for PHP >=5.4

//Accessing an array element
echo $array[0];

配列要素にアクセスする

配列の特定の要素にアクセスするために [] または {} で、アクセスしたいキーに評価されます。

配列[

(任意の式)

]

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

echo $array[

0

]; //キーは 

整数

; 0の要素にアクセスします
echo $array[

"0"

]; //キーは 

文字列

; 0の要素にアクセスします
echo $array[

"文字列"

]; //キーは 

文字列

; キーが'string'の要素にアクセスします。
echo $array[

CONSTANT

]; //キーが 

定数

 で、対応する値に置き換えられます
echo $array[

cOnStAnT

]; //キーはまた 

定数

 であり、文字列ではありません
echo $array[

$anyVariable

]  //The key is a 

変数

 で、'$anyVariable' にある値で置き換えられます。
echo $array[

関数XY()

]; //キーは 

戻り値

 である。

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

複数の配列が互いに入り組んでいる場合、単純に多次元配列となります。サブ配列内の配列要素にアクセスするには、複数の [] .

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

オブジェクト

オブジェクトのプロパティにアクセスするには -> .

echo $object->property;

オブジェクトが別のオブジェクトの中にある場合、複数の -> を使って、オブジェクトのプロパティにアクセスします。

echo $objectA->objectB->property;

注意

  1. また、プロパティ名が無効である場合にも注意が必要です。無効なプロパティ名で直面する可能性のあるすべての問題を見るには、以下を参照してください。 質問/回答 . そして、特に これ のように、プロパティ名の先頭に数字がある場合。

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

配列とオブジェクト

配列とオブジェクトが混在している場合、配列の要素にアクセスするか、オブジェクトのプロパティにアクセスするかを確認し、それに対応する演算子を使用する必要があります。

//オブジェクト
echo $object->anotherObject->propertyArray["elementOneWithAnObject"]->property。
    //├────┘ ├───────────┘ ├───────────┘ ├──────────────────────┘ ├──────┘
     
    //│ │ └─────────────────────────────────┘ 配列要素(オブジェクト) ; 使用方法 


->

 プロパティにアクセスするには
    //│ │ └───────────────────────────────────────────────┘ 配列(プロパティ) ; 使用する。

[]

 配列要素 'elementOneWithAnObject' にアクセスする場合
    //│ └─────────────────────────────────────────┘ property (object) ; use 

->

 プロパティ 'propertyArray' にアクセスするには
    // └────────────────────────────────────────────────────────────┘ object ; use 

->

 anotherObject "プロパティにアクセスするには


//Array
echo $array["arrayElement"]["anotherElement"]->object->property["element"];
    //├───┘ ├────────────┘ ├──────────────┘ ├────┘ ├──────┘ ├───────┘
    //│ │ └── 配列要素 ; 
    //│ │ └──────────────────────────── プロパティ(配列) ; 用途 

[]

 配列の要素 'element' にアクセスするには
    //│ │ └───────────────────────────────── プロパティ(オブジェクト) ; 使用方法 

->

 プロパティ'property'にアクセスするには
    //│ │ └─────────────────────────────────────┘ 配列要素(オブジェクト); 使用する 

->

 オブジェクト'プロパティにアクセスするには
    //│ └──────────────────────────────────────────────┘ 配列要素(配列);使用する。

[]

 配列の要素 'anotherElement' にアクセスするには
    // └─────────────────────────────────────────────────────────┘ array ; use 

[]

 配列の要素 'arrayElement' にアクセスするには


これで、配列やオブジェクトが互いに入れ子になっているときに、どのようにアクセスすればよいのか、おおまかなイメージがつかめたのではないでしょうか。

  1. 配列と呼ばれるかオブジェクトと呼ばれるかは、変数の一番外側に依存します。だから [new StdClass] 勢揃い その中に(ネストされた)オブジェクトがあっても、また $object->property = array(); 中に(ネストされた)配列があっても

    また、オブジェクトか配列かわからない場合は、そのまま gettype() .

  2. 自分とは別のコーディングスタイルを使っている人がいても、混乱しないようにしましょう。

     //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                   
               )    
        )
)

1次元目をループさせると、1次元目のすべての値が取得されます。

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

つまり、1次元目では、キー()を持つ要素は1つだけです。 $key ) data という値( $value ):

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次元目では、3つの要素をキーとして持つことになる( $key ) 0 , 1 , 2 という値( $value ):

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' => 
  (object) array(
     'property' => 
    array (
      0 => 1,
      1 => 2,
      2 => 3,
    ),
  ),
)

このように、どの出力もかなり似ていますね。そして、値2にアクセスしたい場合は、アクセスしたい値そのものから始めて、左上"に向かって作業を進めればよいのです。

1. まず、値 2 がキー 1 を持つ配列にあることがわかります。

// var_dump()
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)    // <-- value we want to access
  [2]=>
  int(3)
}

// print_r()
Array
(
    [0] => 1
    [1] => 2    // <-- value we want to access
    [2] => 3
)

// var_export()
array (
  0 => 1,
  1 => 2,    // <-- value we want to access
  2 => 3,
)

これはつまり [] で値 2 にアクセスし [1] でアクセスすることができます。

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

// var_dump()
object(stdClass)#1 (1) {
  ["property"]=>
  /* Array here */
}

// print_r()
stdClass Object
(
    [property] => /* Array here */
)

// var_export()
(object) array(
    'property' => 
  /* Array here */
),

これはつまり -> を使ってオブジェクトのプロパティにアクセスすることです、例えば ->property .

ということで、今までは ->property[1] .

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

// var_dump()
array(1) {
  ["key"]=>
  /* Object & Array here */
}

// print_r()
Array
(
    [key] => stdClass Object
        /* Object & Array here */
)

// var_export()
array (
  'key' => 
  /* Object & Array here */
)

配列の要素にアクセスするために [] でアクセスしなければならないことは知っていますが、ここでは ["key"] を使ってオブジェクトにアクセスしています。これで、これらのパーツをまとめて書けるようになりました。

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

と出力されます。

2

PHPに荒らされないために!

PHPに何時間も費やさないために、知っておかなければならないことがいくつかあります。

  1. 隠し文字 について

    時々、ブラウザで最初に見たときには見えない文字がキーに含まれていることがあります。そして、なぜその要素にアクセスできないのかと自問することになります。このような文字には、タブ ( \t )、改行( \n )、スペースやhtmlタグ(例. </p> , <b> など)。

    の出力を見てみると、例として print_r() と表示されます。

    Array ( [key] => HERE ) 
    
    

    では、その要素にアクセスしようとしています。

    echo $arr["key"];
    
    

    でも、お知らせが来ていますね。

    通知です。未定義のインデックス:キー

    これは、キーがかなり正しいように見えても、要素にアクセスできないので、何か隠された文字があるに違いないということを示す良い兆候です。

    ここでのトリックは var_dump() + を使うことです。(代替案として highlight_string(print_r($variable, TRUE)); )

    そして突然、もしかしたらこんなものが出てくるかもしれません。

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

    これで、キーに html タグと改行文字が含まれていることがわかると思います。 print_r() と表示され、ブラウザがそれを表示しなかったからです。

    では、もしあなたが

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

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

    HERE
    
    
  2. の出力は決して信用しないでください。 print_r() または var_dump() というように、XMLで見ると

    オブジェクトに読み込まれた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
        )
    
    )
    
    

    このように、titleの属性が表示されないことがお分かりいただけると思います。ですから、私が言ったように、決して var_dump() または print_r() は、XMLオブジェクトがある場合に使用します。常に asXML() でXMLファイル/文字列の全容を確認できます。

    ですから、以下に示す方法のいずれかを使用すればよいのです。

    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>
    
    

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

一般的なこと(シンボル、エラー)

プロパティ名の問題