現在の言語: 日本語

戻る

連想配列(2)
配列関連

連想配列は、データに名前(キー)を付けて管理できる便利な仕組みです。
キーを指定してそのキーに紐づく値を取得することで直感的なデータ構造を把握できます。


[サンプル]

copy
class test1
{
	function test1()
	{
		$userAll=[];
	
		$user=[];
		$user["name"]="yamada";
		$user["age"]=20;
	
		$userAll[]= $user;
	
		$user=[];//追加するため配列初期化します
		$user["name"]="tanaka";
		$user["age"]=21;
	
		$userAll[] = $user;
		print_r($userAll);
		/*
		Array
		(
			[0] => Array
				(
					[name] => yamada
					[age] => 20
				)
		
			[1] => Array
				(
					[name] => tanaka
					[age] => 21
				)
		
		)
		*/
		//件数の取得
		//countを使用したケース
		echo "count:".count($userAll).PHP_EOL;//count:2
		//sizeofを使用したケース
		echo "sizeof:".sizeof($userAll).PHP_EOL;//sizeof:2
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
echo "</pre>";
copy
class test1
{
function test1()
{
$userAll=[];

$user=[];
$user["name"]="yamada";
$user["age"]=20;

$userAll[]= $user;

$user=[];//Initialize the array for addition
$user["name"]="tanaka";
$user["age"]=21;

$userAll[] = $user;
print_r($userAll);
/*
Array
(
[0] => Array
(
[name] => yamada
[age] => 20
)

[1] => Array
(
[name] => tanaka
[age] => 21
)

)
*/
/Get the number of items
//Using count
echo "count:".count($userAll).PHP_EOL;//count:2
//Using sizeof
echo "sizeof:".sizeof($userAll).PHP_EOL;//sizeof:2 
}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
echo "</pre>";

test1関数では連想配列を構造体のデータ形式に見立てて
配列に追加しているサンプルです。
$userAll[] = $user;
このように連想配列を配列に追加しています。

$user=[];//追加するため配列初期化します
$user["name"]="tanaka";
$user["age"]=21;
このように
$user=[];
としているのは、配列に同じ変数を使い回すと参照がコピーされるためです。
$userという配列を作っています。
この$user配列に値を設定して
$userAll[] = $user;(連想配列データを配列に追加)と実行すると
$userAll[0]は$userが格納されているメモリの場所(ポインタ)を参照します。
$user=[];のように初期化をしないで
$user["user"]="xxx";のようにデータを書き換えて
$userAll[] = $user;と実行すると
$userは次のデータ($userAll[1])に追加します。
そして、初期化をしないで行っているということは
上書き変更をしてしまうため、$userAll[0]が参照しているメモリ領域も同時に変更してしまいます。
結果として$userAll[0]と$userAll[1]は全く同じ最後に追加したデータを指すことなってしまいます。
この参照による代入を防ぐため
新しいメモリ領域を確保するため
$user=[];
と初期化をしているわけです。

件数はcount関数もしくはsizeof関数で取得できます。
sizeof関数はcount関数のエイリアスです。

copy
class test2
{
	function test1()
	{
		$user1=[
		"name"=>"yamada",
		"age"=>20
		];
		//参照渡し(&)によるデータの共有を舌ケース
		$user2 = &$user1;
		echo "user1配列".PHP_EOL;
		print_r($user1);
		echo "user2配列".PHP_EOL;
		print_r($user2);
		//[結果]
		/*
		user1配列
		Array
		(
			[name] => yamada
			[age] => 20
		)
		user2配列
		Array
		(
			[name] => yamada
			[age] => 20
		)
		*/
		//ageキーの値を$user2のみ変更してみます
		$user2["age"]=21;
		//変更後の結果
		echo "user1配列".PHP_EOL;
		print_r($user1);
		echo "user2配列".PHP_EOL;
		print_r($user2);
		//[結果]
		/*
		user1配列
		Array
		(
			[name] => yamada
			[age] => 21
		)
		user2配列
		Array
		(
			[name] => yamada
			[age] => 21
		)
		*/
	}
	function test2()
	{
		$user=[
		"name"=>"yamada",
		"age"=>20
		];

		$this->testArray1($user);
		//Fatal error:  Uncaught TypeError: test2::testArray1(): Argument #1 ($ary) must be of type array, null given, called
		//$this->testArray1(null);
		$this->testArray2($user);
		/*
		Array
		(
			[name] => yamada
			[age] => 20
		)
		*/
		$this->testArray2(null);//ary is null
		echo $this->checkArray(null).PHP_EOL;
		$user_age_none=[
		"name"=>"yamada"
		];
		$user_name_none=[
		"age"=>20
		];
		$this->checkArray($user_age_none).PHP_EOL;
		$this->checkArray($user_name_none).PHP_EOL;
		$this->checkArray($user).PHP_EOL;
	}
	//引数の型(array)
	private function testArray1(array $ary)
	{
		print_r($ary);
	}
	//nullable宣言
	private function testArray2(?array $ary)
	{
		if($ary === null)
		{
			echo "array is null".PHP_EOL;
			return;
		}
		print_r($ary);
	}
	private function checkArray(?array $ary)
	{
		if($ary === null)
		{
			echo "array is null".PHP_EOL;
			return;
		}
		if(empty($ary))
		{
			echo "array is empty.".PHP_EOL;
			return;
		}
		if(!is_array($ary))
		{
			echo "it is not array.".PHP_EOL;
			return;
		}
		//nameキーの存在チェック
		if (!isset($ary['name'])) 
		{
			echo "'name' キーがありません。".PHP_EOL;
			return;
		}
		// ageキーの存在チェック
		if (!isset($ary['age'])) 
		{
			echo "'age' キーがありません。".PHP_EOL;
			return;
		}
		//nameの文字列判定
		if (!is_string($ary['name'])) 
		{
			echo "'name' は文字列ではありません。".PHP_EOL;
			return;
		}
		//ageの整数判定
		if (!is_int($ary['age'])) 
		{
			echo "'age' は整数ではありません。".PHP_EOL;
			return;
		}
		echo "連想配列のチェックが終わりました。";
	}
}
echo "<pre>";

$cls2 = new test2();
$cls2->test1();
$cls2->test2();
echo "</pre>";
copy
class test2
{
function test1()
{
$user1=[
"name"=>"yamada",
"age"=>20
];
// Sharing data by reference (&)
$user2 = &$user1;
echo "user1Array".PHP_EOL;
print_r($user1);
echo "user2Array".PHP_EOL;
print_r($user2);
// [Result]
/*
user1Array
Array
(
[name] => yamada
[age] => 20
)
user2Array
Array
(
[name] => yamada
[age] => 20
)
*/
// Change the value of the age key for $user2 only
$user2["age"]=21;
// Result after change
echo "user1Array".PHP_EOL;
print_r($user1);
echo "user2Array".PHP_EOL; 
print_r($user2); 
//[result] 
/* 
user1 array 
Array 
( 
[name] => yamada 
[age] => 21 
) 
user2 array 
Array 
( 
[name] => yamada 
[age] => 21 
) 
*/ 
} 
function test2() 
{ 
$user=[ 
"name"=>"yamada", 
"age"=>20 
]; 

$this->testArray1($user); 
//Fatal error: Uncaught TypeError: test2::testArray1(): Argument #1 ($ary) must be of type array, null given, called 
//$this->testArray1(null); 
$this->testArray2($user); 
/* 
Array 
( 
[name] => yamada 
[age] => 20 
) 
*/ 
$this->testArray2(null);//ary is null 
echo $this->checkArray(null).PHP_EOL; 
$user_age_none=[ 
"name"=>"yamada" 
]; 
$user_name_none=[ 
"age"=>20 
]; 
$this->checkArray($user_age_none).PHP_EOL; 
$this->checkArray($user_name_none).PHP_EOL; 
$this->checkArray($user).PHP_EOL; 
} 
//Argument type (array) 
private function testArray1(array $ary) 
{ 
print_r($ary); 
} 
//nullable declaration 
private function testArray2(?array $ary) 
{ 
if($ary === null) 
{ 
echo "array is null".PHP_EOL; 
return; 
} 
print_r($ary); 
} 
private function checkArray(?array $ary) 
{ 
if($ary === null) 
{ echo "array is null".PHP_EOL;
return;
}
if(empty($ary))
{
echo "array is empty.".PHP_EOL;
return;
}
if(!is_array($ary))
{
echo "it is not an array.".PHP_EOL;
return;
}
//Check for existence of name key
if (!isset($ary['name']))
{
echo "'name' key does not exist.".PHP_EOL;
return;
}
//Check for existence of age key
if (!isset($ary['age']))
{
echo "'age' key does not exist.".PHP_EOL;
return;
}
//Check for string value of name
if (!is_string($ary['name']))
{
echo "'name' is not a string.".PHP_EOL;
return;
}
//Check for integer value of age
if (!is_int($ary['age']))
{
echo "'age' is not an integer.".PHP_EOL;
return;
}
echo "Associative array check completed.";
}
}
echo "
";

$cls2 = new test2();
$cls2->test1();
$cls2->test2();
echo "
";class test2
{
function test1()
{
$user1=[
"name"=>"yamada",
"age"=>20
];
// Sharing data by reference (&)
$user2 = &$user1;
echo "user1Array".PHP_EOL;
print_r($user1);
echo "user2Array".PHP_EOL;
print_r($user2);
// [Result]
/*
user1Array
Array
(
[name] => yamada
[age] => 20
)
user2Array
Array
(
[name] => yamada
[age] => 20
)
*/
// Change the value of the age key for $user2 only
$user2["age"]=21;
// Result after change
echo "user1Array".PHP_EOL;
print_r($user1);
echo "user2Array".PHP_EOL; 
print_r($user2); 
//[result] 
/* 
user1 array 
Array 
( 
[name] => yamada 
[age] => 21 
) 
user2 array 
Array 
( 
[name] => yamada 
[age] => 21 
) 
*/ 
} 
function test2() 
{ 
$user=[ 
"name"=>"yamada", 
"age"=>20 
]; 

$this->testArray1($user); 
//Fatal error: Uncaught TypeError: test2::testArray1(): Argument #1 ($ary) must be of type array, null given, called 
//$this->testArray1(null); 
$this->testArray2($user); 
/* 
Array 
( 
[name] => yamada 
[age] => 20 
) 
*/ 
$this->testArray2(null);//ary is null 
echo $this->checkArray(null).PHP_EOL; 
$user_age_none=[ 
"name"=>"yamada" 
]; 
$user_name_none=[ 
"age"=>20 
]; 
$this->checkArray($user_age_none).PHP_EOL; 
$this->checkArray($user_name_none).PHP_EOL; 
$this->checkArray($user).PHP_EOL; 
} 
//Argument type (array) 
private function testArray1(array $ary) 
{ 
print_r($ary); 
} 
//nullable declaration 
private function testArray2(?array $ary) 
{ 
if($ary === null) 
{ 
echo "array is null".PHP_EOL; 
return; 
} 
print_r($ary); 
} 
private function checkArray(?array $ary) 
{ 
if($ary === null) 
{ echo "array is null".PHP_EOL;
return;
}
if(empty($ary))
{
echo "array is empty.".PHP_EOL;
return;
}
if(!is_array($ary))
{
echo "it is not an array.".PHP_EOL;
return;
}
//Check for existence of name key
if (!isset($ary['name']))
{
echo "'name' key does not exist.".PHP_EOL;
return;
}
//Check for existence of age key
if (!isset($ary['age']))
{
echo "'age' key does not exist.".PHP_EOL;
return;
}
//Check for string value of name
if (!is_string($ary['name']))
{
echo "'name' is not a string.".PHP_EOL;
return;
}
//Check for integer value of age
if (!is_int($ary['age']))
{
echo "'age' is not an integer.".PHP_EOL;
return;
}
echo "Associative array check completed.";
}
}
echo "<pre>";

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

$user2 = &$user1;
参照渡し(&)を使用して連想配列を作成した場合はメモリは同じ場所をみます。
そのため、どこか一部を変更すると他方の連想配列も同じ結果になります。

private function checkArray(?array $ary)
連想配列のチェック処理のサンプルです。
とはいっても、内部にキーがあるのか?
型が正しいか?程度であり
受け取った引数が空白だったりすると、関数の引数にarray型を設定しているため
エラー(TypeError)が発生します。
連想配列のチェック処理は状況によって必要となりますが
仕様として設計思想をどこまで取り込むかという視点で利用する方が良いのかもしれません。



戻る

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