現在の言語: 日本語

戻る

連想配列(3)
配列関連

連想配列は、データに名前(キー)を付けて管理できる便利な仕組みです。
キーを指定してそのキーに紐づく値を取得することで直感的なデータ構造を把握できます。
連想配列はstdClassを使ってオブジェクトにキャストできます。
また、オブジェクトにキャストしたあともarrayでキャストすることで連想配列に戻すことができます。

[stdClassの主な特徴]
[空のクラス]
デフォルトではプロパティもメソッドも含まれていません。
[動的プロパティ]
実行時にプロパティを自由に追加・削除できます。
[データコンテナ]
主にデータ保存用の器として機能します。
[基底クラスではない]
他のすべてのPHPクラスの親クラス(基底クラス)ではありません。


[サンプル]

copy
class test1
{
	private function sampleSelectTable():object
	{
		$users = new stdClass;
		// データベース接続設定(仮の値)
		$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8mb4';
		$user = 'user';
		$password = 'password';
		
		try {
			$pdo = new PDO($dsn, $user, $password);
			// エラーモードを設定しておくとデバッグしやすい
			$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			//name:名前
			//age:年齢
			$stmt = $pdo->query("select name, age from users");
		
			//PDO::FETCH_OBJを指定すると
			//各レコードがstdClass オブジェクトとしてフェッチされます
			$users = $stmt->fetchAll(PDO::FETCH_OBJ);
		
		} catch (PDOException $e) {
			echo "データベース接続エラー: " . $e->getMessage();
		}
		return $users;
	}
	function test1()
	{
		$obj = $this->sampleSelectTable();
		//[取得した例]
		/*
		$obj = [
			// インデックス 0
			(object) ["name" => "yamada", "age" => 20],
		
			// インデックス 1
			(object) ["name" => "tanaka", "age" => 21]
		];
		*/
		//$objはstdClassの配列になります
		$no = 1;
		foreach ($obj as $user) 
		{
			//連想配列ではなく、アロー演算子(->)でプロパティにアクセスします
			echo $no."件目".PHP_EOL;
			echo "名前:" . $user->name.PHP_EOL;
			echo "年齢:" . $user->age.PHP_EOL;
			$no++;
		}
		//[結果の例]
		/*
		1件目
		名前:yamada
		年齢:20
		2件目
		名前:tanaka
		年齢:21
		*/
		//$ary = (array)$obj;
		
		$no = 1;
		foreach ($obj as $user) {
			// $obj は stdClass オブジェクト (1件)
			$ary = (array)$user;
			// $user_array は連想配列 (1件)
			// Array ( [id] => 1 [name] => 山田 [age] => 30 ) になる
			echo $no."件目".PHP_EOL;
			foreach ($ary as $key => $value) 
			{
				echo $key . ': ' . $value . PHP_EOL;
			}
			$no++;
		}
		//[結果の例]
		/*
		1件目
		name: yamada
		age: 20
		2件目
		name: tanaka
		age: 21
		*/
	}
	function test2()
	{
		$ary = [];
		$ary1 = [
			"name"=>"tanaka",
			"age" =>21
		];
		$ary[]=$ary1;
		$ary2 = [
			"name"=>"tanaka",
			"age" => 20
		];
		$ary[]=$ary2;
		for($i=0; $iname.PHP_EOL;
			echo "age:".$obj->age.PHP_EOL;
		}
		//[結果]
		/*
		i:0
		name:tanaka
		age:21
		i:1
		name:tanaka
		age:20
		*/
	}

}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
echo "</pre>";
copy
class test1
{
	private function sampleSelectTable():object
	{
		$users = new stdClass;
		// Database connection settings (tentative values)
		$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8mb4';
		$user = 'user';
		$password = 'password';
		
		try {
			$pdo = new PDO($dsn, $user, $password);
			// Setting the error mode makes debugging easier.
			$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			//name: Name
			//age: Age
			$stmt = $pdo->query("select name, age from users");
			
			//If PDO::FETCH_OBJ is specified
			//Each record will be fetched as a stdClass object.
			$users = $stmt->fetchAll(PDO::FETCH_OBJ);
		
		} catch (PDOException $e) {
			echo "Database connection error: " . $e->getMessage();
		}
		return $users;
	}
	function test1()
	{
		$obj = $this->sampleSelectTable();
		//[Retrieved example]
		/*
		$obj = [
		// Index 0
		(object) ["name" => "yamada", "age" => 20],
		
		// Index 1
		(object) ["name" => "tanaka", "age" => 21]
		];
		*/
		// $obj is an array of stdClass.
		$no = 1;
		foreach ($obj as $user)
		{
			// Access properties with the arrow operator (->) instead of an associative array.
			echo $no."item".PHP_EOL;
			echo "Name:" . $user->name.PHP_EOL;
			echo "Age:" . $user->age.PHP_EOL;
			$no++;
		}
		//[Example Result]
		/*
		1st Result
		Name: Yamada
		Age: 20
		2nd Result
		Name: Tanaka
		Age: 21
		*/
		//$ary = (array)$obj;
		
		$no = 1;
		foreach ($obj as $user) {
			// $obj is a stdClass object (1 result)
			$ary = (array)$user;
			// $user_array is an associative array (1 result)
			// Becomes Array ( [id] => 1 [name] => Yamada [age] => 30 )
			echo $no.item.PHP_EOL;
			foreach ($ary as $key => $value)
			{
				echo $key . ': ' . $value . PHP_EOL;
			}
			$no++;
		}
		//[Example Result]
		/*
		1st Result
		name: Yamada 
		age: 20 
		2nd item 
		name: tanaka 
		age: 21 
		*/ 
	} 
	function test2() 
	{ 
		$ary = []; 
		$ary1 = [ 
		"name"=>"tanaka", 
		"age" =>21 
		]; 
		$ary[]=$ary1; 
		$ary2 = [ 
		"name"=>"tanaka", 
		"age" => 20 
		]; 
		$ary[]=$ary2; 
		for($i=0; $iname.PHP_EOL; 
			echo "age:".$obj->age.PHP_EOL; 
		} 
		//[result] 
		/* 
		i:0 
		name:tanaka 
		age:21 
		i:1 
		name:tanaka 
		age:20 
		*/ 
	}

}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
echo "</pre>";

データベースのテーブルなどからデータを取得したときに1件ずつのオブジェクトとして配列に格納しています。
このデータを連想配列として使用する場合は
array型にキャストをすることでデータを取り出すことができます。
上記のステップではforeachで1件の$userオブジェクトを取り出しています。
$ary = (array)$user;
そのオブジェクトをarrayでキャストすることで連想配列に変換しています。

tes2関数では
連想配列を配列に追加しています。
$obj =(object)$ary[$i];
上記のように、その配列からデータを順次取り出し、objectでキャストしています。

そしてオブジェクトからアロー演算子を使ってデータを取り出すことができます。

このように配列で連想配列とオブジェクトをキャストにより相互変換することができます。



戻る

著作権情報
ホームページおよプリ等に掲載されている情報等については、いかなる保障もいたしません。
ホームページおよびアプリ等を通じて入手したいかなる情報も複製、販売、出版または使用させたり、
または公開したりすることはできません。
当方は、ホームページおよびアプリ等を利用したいかなる理由によっての障害等が発生しても、
その結果ホームページおよびアプリ等を利用された本人または他の第三者が被った損害について
一切の責任を負わないものとします。