配列/オブジェクトにアクセスするにはどうすればよいですか?
質問
以下のような配列があるのですが、これを
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;
注意
-
また、プロパティ名が無効である場合にも注意が必要です。無効なプロパティ名で直面する可能性のあるすべての問題を見るには、以下を参照してください。 質問/回答 . そして、特に これ のように、プロパティ名の先頭に数字がある場合。
-
プロパティにアクセスできるのは、パブリックな 可視性 を持つプロパティにのみ、クラスの外側からアクセスできます。それ以外の場合(プライベートまたはプロテクト)、プロパティの値を取得するために使用できる、メソッドまたはリフレクションが必要です。
配列とオブジェクト
配列とオブジェクトが混在している場合、配列の要素にアクセスするか、オブジェクトのプロパティにアクセスするかを確認し、それに対応する演算子を使用する必要があります。
//オブジェクト 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' にアクセスするには
これで、配列やオブジェクトが互いに入れ子になっているときに、どのようにアクセスすればよいのか、おおまかなイメージがつかめたのではないでしょうか。
注
-
配列と呼ばれるかオブジェクトと呼ばれるかは、変数の一番外側に依存します。だから
[new StdClass]
は 勢揃い その中に(ネストされた)オブジェクトがあっても、また$object->property = array();
は 物 中に(ネストされた)配列があってもまた、オブジェクトか配列かわからない場合は、そのまま
gettype()
. -
自分とは別のコーディングスタイルを使っている人がいても、混乱しないようにしましょう。
//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に何時間も費やさないために、知っておかなければならないことがいくつかあります。
-
隠し文字 について 時々、ブラウザで最初に見たときには見えない文字がキーに含まれていることがあります。そして、なぜその要素にアクセスできないのかと自問することになります。このような文字には、タブ (
\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
-
の出力は決して信用しないでください。
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>
詳細については、以下を参照してください。
一般的なこと(シンボル、エラー)
プロパティ名の問題
関連
-
[解決済み】PHP フェイタルエラー。未定義の関数mssql_connect()をコールしています。
-
[解決済み】/var/www/htmlとは何ですか?[クローズド]
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] JavaScriptのオブジェクトにキーが存在するかどうかをチェックする?
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み】未定義のオブジェクトプロパティを検出する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PHPで空の値からデフォルトオブジェクトを作成する?
-
[解決済み】SQLSTATE[42000]: 構文エラーまたはアクセス違反が発生しました。1064 SQL 構文にエラーがあります - PHP - PDO [重複]。
-
[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: バインドされた変数の数が102行目のトークンの数と一致しない [終了]
-
[解決済み】「Fatal error: Class 'MySQLi' not found "を解決するには?
-
[解決済み】Laravel 5.2 Storage::makeDirectory($dir) でディレクトリが作成されない。
-
[解決済み] 入力ファイルが指定されていない
-
[解決済み】chromeの「net : Failed to load resource: net::ERR_SPDY_PROTOCOL_ERROR" は何がおかしいのか?
-
[解決済み] PHP - ストリームを開くのに失敗しました : そのようなファイルまたはディレクトリがありません。
-
[解決済み] Uncaught SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?