PHPでオブジェクトを配列に変換するには、単純な変換なら(array)キャストかget_object_vars()、ネストしたオブジェクトまで丸ごと配列化したいならjson_decode(json_encode($obj), true)を使います。本稿では3つの方法それぞれの挙動と落とし穴、用途別の使い分けを、最小コードとともに解説します。
| この記事の要点 |
|---|
|
主な変換方法の一覧
PHPには標準で複数の変換手段があります。まず全体像を把握しておきましょう。
- 方法①
(array)キャスト … 関数不要・最速。すべてのプロパティを拾うが、private/protectedのキー名が特殊になる。 - 方法②
get_object_vars()… アクセス可能なプロパティだけをクリーンに取得。 - 方法③
json_decode(json_encode($obj), true)… ネスト構造ごと配列化したいときの定番。
それぞれ詳しく見ていきます。
方法① (array)キャストで変換する
もっとも手軽なのは型キャストです。オブジェクトの前に(array)を付けるだけで配列になります。
|
<?php |
publicプロパティだけのクラスなら、これで期待どおりの連想配列が得られます。
注意:private/protectedプロパティのキー名が特殊になる
(array)キャストはprivateやprotectedのプロパティも配列に含めますが、そのキー名に不可視の制御文字(ヌルバイト \0)が付与されるという独特の仕様があります。具体的には次のようになります。
- privateプロパティ → キーが
\0クラス名\0プロパティ名になる - protectedプロパティ → キーが
\0*\0プロパティ名になる(*はアスタリスク1文字) - publicプロパティ → キーはプロパティ名そのまま
|
<?php |
このヌルバイトは画面上では見えませんが文字列の一部としてキーに含まれているため、$array['name'] のように普通の名前ではアクセスできません。echoでは消えて見えるのにキー比較が一致しない、という分かりにくいバグの原因になります。private/protectedを持つクラスを安全に配列化したい場合は、後述の方法②・③を検討してください。
方法② get_object_vars()で変換する
get_object_vars()は、対象オブジェクトのアクセス可能なプロパティを連想配列で返す関数です。キー名はプロパティ名そのままで、ヌルバイトのような特殊文字は付きません。
|
<?php |
ポイントは「アクセス可能なプロパティ」という点です。呼び出す場所によって取得できる範囲が変わります。
- クラスの外から呼ぶと、
publicプロパティのみが返る(上記の例ではpinは含まれない)。 - クラスの内側(メソッド内)から
$thisを渡して呼ぶと、private・protectedも含めて返る。
|
<?php |
ヌルバイト問題を避けつつ、可視性を意図的にコントロールしたいときに最適な方法です。なお、この関数は1階層分のプロパティだけを配列化します。プロパティの値がさらにオブジェクトの場合、その値はオブジェクトのまま残ります(再帰しません)。
方法③ json_decode(json_encode())で変換する
ネストした構造ごと配列化したい場合の定番が、JSONを経由する方法です。json_encode()でいったんJSON文字列にし、json_decode()の第2引数にtrueを渡して連想配列としてデコードします。
|
<?php |
このとおり、入れ子になったAddressオブジェクトまで再帰的に配列へ変換されます。これが他の2方法にはない最大の利点です。一方で、JSONを経由するがゆえの注意点があります。
- publicプロパティしか変換されない …
json_encode()はデフォルトでprivate/protectedを無視するため、それらは結果に含まれない(JsonSerializableを実装すれば制御可能)。 - 型情報が失われる … すべてJSONで表現可能な型(文字列・数値・配列など)に変換される。リソース型などは扱えない。
- 非UTF-8データで失敗する …
json_encode()はUTF-8でない文字列があるとfalseを返し、変換が壊れることがある。 - 2回の変換コストがかかる … 大量データでは(array)キャストより遅い。
3つの方法の比較
用途別に整理すると次のとおりです。private/protectedを含み、かつ最も安全に扱える観点では用途に応じた選択になりますが、一般的なDTOの変換では推奨行の方法が無難です。
| 方法 | 変換の深さ | 対象の可視性 | キー名 | 主な用途 |
|---|---|---|---|---|
(array) キャスト |
浅い(1階層) | public/protected/private すべて | private/protectedに\0が付く |
publicのみのクラスを高速変換 |
get_object_vars() |
浅い(1階層) | 呼び出し位置で変化(外=public) | プロパティ名そのまま(クリーン) | 可視性を制御した安全な変換 |
json_decode(json_encode()) |
深い(再帰) | publicのみ | プロパティ名そのまま | ネスト構造ごと配列化 |
逆方向:配列をオブジェクトに変換する
反対に、配列をオブジェクトへ変換したい場合は(object)キャストが使えます。結果はstdClassのインスタンスになり、各キーがプロパティになります。
|
<?php |
ネストした配列まで再帰的にオブジェクト化したい場合は、こちらもjson_decode(json_encode($array))(第2引数を省略、またはfalse)を使うと、入れ子の配列までstdClassに変換できます。
落とし穴まとめ
| つまずきやすいポイント |
|---|
|
よくある質問(FAQ)
Q1.結局どの方法を使えばいいですか?
プロパティがpublicだけのシンプルなクラスなら(array)キャストが最速で十分です。private/protectedを含み、キー名をきれいに保ちたいならget_object_vars()。オブジェクトが入れ子になっていて全体を配列にしたいならjson_decode(json_encode($obj), true)を選びます。
Q2.(array)キャストで付くヌルバイトを取り除くには?
根本的には、private/protectedを正しく扱えるget_object_vars()(クラス内から呼ぶ)や、クラスにtoArray()メソッドを実装する方法に切り替えるのが安全です。すでにヌルバイト入りの配列を持っている場合は、キー文字列の\0区切りを分解して名前を取り出すこともできますが、最初から付かない方法を選ぶほうが確実です。
Q3.多次元(ネスト)のオブジェクトをまとめて配列化できますか?
はい。json_decode(json_encode($obj), true)なら、プロパティとして保持された別のオブジェクトや配列まで再帰的に配列へ変換されます。ただしpublicプロパティのみが対象で、型情報は失われる点に注意してください。private/protectedも含めて再帰変換したい場合は、各クラスに自前のtoArray()を実装するのが確実です。
子ページはありません
同階層のページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- djangoのテンプレートの作成とヘッダー・フッターの共通化 2026-10-03 21:41:49
- テンプレートフラグメント(ヘッダー等の共有化) 2026-10-03 21:41:49
- reCAPTCHA v3 使い方(サンプル付き) 2026-10-03 21:37:05
- Content-Type一覧|MIMEタイプとはとHTTPでの主な使用場面 2026-10-03 21:37:05
- SpringにおけるAOPの使い方 2026-10-03 21:37:05
- X (Twitter) API でツイートできないがエラーが出ない問題の原因と対処 2026-10-03 11:33:01
- X (Twitter) API アプリケーション登録完全ガイド|v2・Bearer Token・OAuth 2.0 PKCE 2026-10-03 11:33:01
- X (Twitter) API 完全ガイド|従量課金の料金・単価(2026年10月)と v2 移行 2026-10-03 11:32:40
- Google DeepMind とは?Gemini・AlphaFold の開発元 2026-10-03 11:26:56
- Cursor とは?AI 統合型コードエディタの使い方・料金 2026-10-03 11:26:56
- Claude (Anthropic) とは?AIチャットの使い方・モデルファミリ・API 2026-10-03 11:26:56
- AIベンダー一覧:OpenAI・Anthropic・Google DeepMind・Microsoft・Meta 2026-10-03 11:26:56
- クラウド・インフラ完全ガイド — AWS/Azure/GCP/Kubernetes 2026-10-03 11:26:56
- テキストエディタ完全比較 (VS Code / Cursor / Vim / Emacs / IDE) 2026-10-03 11:26:56
- プログラミング学習プラットフォーム|Scratch・micro:bit ほか 2026-10-03 11:26:56