現在の言語: 日本語

戻る

配列型
php型宣言

配列の初期化(初期値を設定するケース)
$fruits = ['apple', 'orange', 'banana'];
または
array('apple', 'orange', 'banana');
配列を初期化(空の配列して配列を準備するケース)
$fruits = [];
または
$fruits = array();
配列のデータが入った場合のクリアおよび初期化するケース
$fruits = [];
または
$fruits = array();
この他に配列をクリアする方法として
unset()がありますが、このunsetでクリアする方法は非推奨となっています。
これ以外にもarray_splice()関数を使用して要素をすべて削除する方法もあります。
array_splice($fruits, 0, count($fruits));
0番目から最後まで全て削除し、空の配列にします


[サンプル]

copy
class test1
{
	public int $num = 0;
	public string $str = "";
	function test1():void
	{
		$person = [
			'name' => 'Taro Yamada',
			'age' => 25,
		];
		$this->test2($person);
		//関数呼び出し後の外部での age の表示
		echo "age:" . $person['age'] . PHP_EOL;//age:25
	}
	//引数に値渡しを使用したケース
	private function test2(array $ary):void
	{
		//関数内部で変更してみる
		$ary['age'] = $ary['age'] + 1;
		// $ary を使って配列の要素にアクセスする
		echo "名前は" . $ary['name'] . PHP_EOL;//名前はTaro Yamada
		echo "来年は" . $ary['age'] . "歳です。" . PHP_EOL;//来年は26歳です。
	}
	function test3():void
	{
		$person = [
			'name' => 'Taro Yamada',
			'age' => 25,
		];
		$this->test2($person);
		//関数呼び出し後の外部での age の表示
		echo "age:" . $person['age'] . PHP_EOL;//age:25
	}
	//引数に&(参照渡し)を使用したケース
	private function test4(array &$ary):void
	{
		//関数内部で変更してみる
		$ary['age'] = $ary['age'] + 1;
		// $ary を使って配列の要素にアクセスする
		echo "名前は" . $ary['name'] . PHP_EOL;//名前はTaro Yamada
		echo "来年は" . $ary['age'] . "歳です。" . PHP_EOL;//来年は26歳です。
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();//値渡しのケース
$cls1->test3();//参照渡しのケース
$cls = new test1();
$cls->num = 100;
$cls->str = "test";
function test5(test1 $cls)
{
	$cls->num = $cls->num + 1;
	$cls->str = $cls->str . " add";
}
test5($cls);
echo $cls->num.PHP_EOL;//101
echo $cls->str.PHP_EOL;//test add

echo "</pre>";
copy
class test1
{
	public int $num = 0;
	public string $str = "";
	function test1():void
	{
		$person = [
		'name' => 'Taro Yamada',
		'age' => 25,
		];
		$this->test2($person);
		// Displaying age outside the function call
		echo "age:" . $person['age'] . PHP_EOL;//age:25
	}
	// Example of passing arguments by value
	private function test2(array $ary):void
	{
		// Try changing it inside the function
		$ary['age'] = $ary['age'] + 1;
		// Accessing an array element using $ary
		echo "My name is" . $ary['name'] . PHP_EOL;//My name is Taro Yamada
		echo "Next year I will be" . $ary['age'] . "years old." . PHP_EOL;//I'll ​​be 26 next year.
	}
	function test3():void
	{
		$person = [
		'name' => 'Taro Yamada',
		'age' => 25,
		];
		$this->test2($person);
		// Displaying age outside the function call
		echo "age:" . $person['age'] . PHP_EOL;//age:25
	}
	// Example of using & (passed by reference) as an argument
	private function test4(array &$ary):void
	{
		// Try changing it within the function
		$ary['age'] = $ary['age'] + 1;
		// Accessing an array element using $ary
		echo "My name is" . $ary['name'] . PHP_EOL;//My name is Taro Yamada
		echo "Next year I will be" . $ary['age'] . "years old." . PHP_EOL;//I will be 26 next year.
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();//Pass by value
$cls1->test3();//Pass by reference
$cls = new test1();
$cls->num = 100;
$cls->str = "test";
function test5(test1 $cls)
{
$cls->num = $cls->num + 1;
$cls->str = $cls->str . " add";
}
test5($cls);
echo $cls->num.PHP_EOL;//101
echo $cls->str.PHP_EOL;//test add

echo "</pre>";

[test1関数(値渡し)を実行したケース]
phpの関数の引数はデフォルトで値渡しとなっています。
そのためtest1関数が実行された場合
$person配列をコピーを作成します。
そのコピーを$aryという新しい配列変数で関数内で渡す。
関数内で配列内のデータを25から26に変更しても
値渡しであるため関数のスコープを抜けて配列に影響がありません。

[test3関数(参照渡し)を実行したケース]
参照渡しをすると$person配列を参照することになるため
関数内部で変更した結果がそのまま反映されることになります。
したがって、
関数内で配列内のデータを25から26に変更すると
26になった結果が関数のスコープを抜けたechoの結果で確認できます。

[test5(クラスをインスタンス化したオブジェクトを引数にしたケース)]
$cls = new test1();
クラスをインスタンス化してオブジェクトを生成します。
$cls->num = 100;
$cls->str = "test";
クラス内の値を変更します(プロパティの変更)
これらの情報のクラスオブジェクトをtest5関数の引数に渡します。
関数内部でクラスオブジェクトの値に変更を加えます。
関数のスコープを抜けて引数として渡したクラスオブジェクトを使って結果を表示すると
関数内部で変更した結果が反映されています。
これはphpではオブジェクトは常に参照渡しされるためです。

こうしてみると配列とオブジェクトとは内部処理が異なることがわかります。
phpの配列は順序つけられたマップ(Ordered Map)というデータ構造です。
内部的にはハッシュテーブルと連動していて、キーと値を効率的に紐づけています。
仕様としては配列を値として扱うことを基本としているようです。
関数に関数の外側に影響を与えないようにデータを操作できるようにしたいことがあるようです。
そのためクラスオブジェクトとは違い、デフォルトの動作は値渡し(コピー)となります。

そのため、配列を引数として関数内部の結果を反映したい場合は
&(参照渡し)を使用した引数にしてください。

配列を関数の引数に使用するとデフォルトでは値渡しになるため
プログラムの実装には気をつける必要があるケースもあります。
値渡しをするということは配列データが内部でコピーされ2倍になる可能性があるためです。
COW(Copy on write)を仕組みとして導入しているため
関数内部で配列の変更がない場合は、配列をコピーすることがないのですが、
データベースのテーブルからデータをselectで取得した場合
通常は受け取った大量の配列データは
表示処理などでは関数内で値を変更して使うことがよくあります。
関数の引数にデフォルトで配列を渡してしまうと値渡しとなるため
内部で配列内容が変更される可能性が高くなり
配列内容が変更されるとCOWの仕組みによりコピーを作ってしまします。
そうするとメモリを配列分追加で使ってしまう結果になります。
そのため、引数に参照渡しをすることで対応することも視野に入れる必要があります。
copy
class test2
{
	private function test1()
	{
		try
		{
			$int = 100;
			//Fatal error:  Uncaught TypeError: test2::testArrayArguments(): Argument #1 ($ary) must be of type array, int given, called
			$this->testArrayArguments($int);
		}catch(Exception $e){
			echo $e->getMessage();
		}
		finally
		{
		}
	}
	private function test2()
	{
		try
		{
			//Fatal error:  Uncaught TypeError: test2::testArrayArguments(): Argument #1 ($ary) must be of type array, null given, called
			$null = null;
			$this->testArrayArguments($null);
		}catch(Exception $e){
			echo $e->getMessage();
		}
		finally
		{
		}
	}
	private function test3()
	{
		try
		{
			//Fatal error:  Uncaught TypeError: test2::testArrayArguments(): Argument #1 ($ary) must be of type array, string given, called
			$str = "test";
			$this->testArrayArguments($str);
		}catch(Exception $e){
			echo $e->getMessage();
		}
		finally
		{
		}
	}
	//引数に配列を使う関数
	private function testArrayArguments(array $ary)
	{
		echo "execute testArrayArguments".PHP_EOL;
	}
	//nullable型を使用したケース
	private function test4(?array $ary)
	{
		if(is_array($ary))
		{
			echo "配列です".PHP_EOL;
		}
		else
		{
			echo "配列ではありません".PHP_EOL;
		}
	}
	private function test5(array $ary =[])
	{
		if(empty($ary))
		{
			echo "空です";
			return;
		}
		foreach($ary as $data)
		{
			echo $data.PHP_EOL;
		}
	}
	function test()
	{
		//$this->test1();//int
		//$this->test2();//null
		//$this->test3();//string
		$int = 100;
		//Fatal error:  Uncaught TypeError: test2::test4(): Argument #1 ($ary) must be of type ?array, int given, called
		//$this->test4($int);
		$ary=[];
		$ary[]=1;
		$ary[]=2;
		//echoの出力結果
		/*
		1
		2
		*/
		$this->test5($ary);
		$ary=[];
		$this->test5($ary);
		//echoの出力結果
		//空です
	}
}
echo "<pre>";

$cls2 = new test2();
$cls2->test();
echo "</pre>";
copy
class test2
{ 
	private function test1() 
	{ 
		try 
		{ 
			$int = 100; 
			//Fatal error: Uncaught TypeError: test2::testArrayArguments(): Argument #1 ($ary) must be of type array, int given, called 
			$this->testArrayArguments($int); 
		}catch(Exception $e){ 
			echo $e->getMessage(); 
		} 
		finally 
		{ 
		} 
	} 
	private function test2() 
	{ 
		try 
		{ 
			//Fatal error: Uncaught TypeError: test2::testArrayArguments(): Argument #1 ($ary) must be of type array, null given, called 
			$null = null; 
			$this->testArrayArguments($null); 
		}catch(Exception $e){ 
			echo $e->getMessage(); 
		} 
		finally 
		{ 
		} 
	} 
	private function test3() 
	{ 
		try 
		{ 
			//Fatal error: Uncaught TypeError: test2::testArrayArguments(): Argument #1 ($ary) must be of type array, string given, called
			$str = "test";
			$this->testArrayArguments($str);
		}catch(Exception $e){
			echo $e->getMessage();
		}
		finally
		{
		}
	}
	// Function using an array as an argument
	private function testArrayArguments(array $ary)
	{
		echo "execute testArrayArguments".PHP_EOL;
	}
	// Example using a nullable type
	private function test4(?array $ary)
	{
		if(is_array($ary))
		{
			echo "It's an array".PHP_EOL;
		}
		else
		{
			echo "It's not an array".PHP_EOL;
		}
	}
	private function test5(array $ary =[])
	{
		if(empty($ary))
		{
			echo "It's empty";
			return;
		}
		foreach($ary as $data)
		{
			echo $data.PHP_EOL;
		}
	}
	function test()
	{
		//$this->test1();//int
		//$this->test2();//null
		//$this->test3();//string
		$int = 100;
		//Fatal error: Uncaught TypeError: test2::test4(): Argument #1 ($ary) must be of type ?array, int given, called
		//$this->test4($int);
		$ary=[];
		$ary[]=1;
		$ary[]=2;
		//echo output result
		/*
		1
		2
		*/
		$this->test5($ary);
		$ary=[];
		$this->test5($ary);
		//echo output result
	//Empty
	}
}
echo "<pre>";

$cls2 = new test2();
$cls2->test();
echo "</pre>";
配列型を引数にしている関数に配列以外を渡すとTypeErrorが発生します。
TypeErrorはPHP7.0以降で導入された厳密なチェック機能です。
これは関数が期待するデータと異なるデータが渡されることを予期せぬバグを防ぎコードの信頼性を高めることを目的としています。
関数が実行された瞬間に判定し、条件に一致しない場合は即時プログラムを停止します。
そのためnullable型を使用して配列以外のデータが入った場合の処理をすることができます。
private function test4(?array $ary)
今回の例ではnullableを関数のarray型の左隣に設定することで
配列型の変数として受け取ったデータを関数のデータとして受け取っています。
そして、これが配列どうか?を判定するためis_array関数で判定しています。
それにより関数の引数として受け取ったデータを仕様に合わせて判定することができます。

また、配列型を関数の引数として使用する場合、デフォルト値を設定することができます。
private function test5(array $ary =[])
この例では空の配列を配列のデフォルト値として設定しています。


戻る

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