現在の言語: 日本語

戻る

連想配列(1)
配列関連

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


[サンプル]

copy
class test1
{
	//単体の連想配列のデータ
	function test1()
	{
		$data=[
			'name' => "tanaka",
			'class' => 1,
		];
		echo "data count:".count($data).PHP_EOL;//data count:2
		echo "data.name:".$data["name"].PHP_EOL;//data.name:tanaka
		echo "data.class:".$data["class"].PHP_EOL;//data.class:1
		$this->changeArray($data, "class", 2);
		echo "data.class:".$data["class"].PHP_EOL;//data.class:2
		$this->deleteFieldArray1($data, "name");
		echo "data count:".count($data).PHP_EOL;//data count:1
		$this->foreachArray($data);
		//foreachの結果
		//class: 2

		$this->addArray($data, "age", 20);
		//foreachの結果
		//class: 2
		//age: 20

		$this->forTest1($data);
		//[結果]
		//class: 2
		//age: 20

		$this->forTest2($data);
		//[結果]
		//class: 2
		//age: 20

		$this->deleteFieldArray2($data, "class");
		$this->foreachArray($data);
		//foreachの結果
		//age: 20

		$this->deleteFieldArray2($data, "age");
		$this->foreachArray($data);
		//foreachの結果
		//データがなくなったため何も表示されません
		echo "data count:".count($data).PHP_EOL;//data count:0
	}
	//foreachを使った配列を読み込む方法
	private function foreachArray(array $ary)
	{
		echo "foreachArray".PHP_EOL;
		foreach ($ary as $key => $value) 
		{
			echo $key . ': ' . $value . PHP_EOL;
		}
	}
	//指定のキーを変更
	private function changeArray(array &$ary, string $key, int $value)
	{
		$ary[$key] = $value;
	}
	//指定のキーを削除(unsetを使用)
	private function deleteFieldArray1(array &$ary, string $key)
	{
		unset($ary[$key]);
	}
	//指定のキーを削除(array_diff_keyを使用)
	private function deleteFieldArray2(array &$ary, string $key)
	{
		// 削除したいキーのリストを新しい配列として定義
		$keys_to_remove = [$key];
		
		// array_diff_key() は、第1引数の配列から第2引数に含まれるキーを取り除いた結果を返します
		$ary = array_diff_key($ary, array_flip($keys_to_remove));
	}
	//指定のキーを削除(array_filterを使用)
	private function deleteFieldArray3(array &$ary, string $removeKey)
	{
		$ary = array_filter(
			$ary,
			function ($key) use ($removeKey) {
				// 削除したいキーと一致しなければTRUE(残す)を返す
				return $key !== $removeKey;
			},
			ARRAY_FILTER_USE_KEY // キーを使ってフィルタリングするフラグ
		);

	}
	//データを追加
	private function addArray(array &$ary, string $key, int $value)
	{
		$ary[$key] = $value;
	}
	//配列の内部ポインタを操作しながらループします
	//reset() と next() を使います
	//可読性が低く、バグの原因になりやすいため、実務ではおすすめしません。
	private function forTest1(array $ary)
	{
		// ポインタを最初の要素にリセット
		reset($ary);
		
		// current()がfalse(またはnull, 0など)でない限りループを続行
		for ($i = 0; current($ary) !== false; next($ary), $i++) 
		{
			$key = key($ary);
			$value = current($ary);
			echo $key . ": " . $value . PHP_EOL;
		}
	}
	//array_keys() ですべてのキーを取得してからループします
	//キーのリストを取得し、それをインデックス配列として for ループで回します。
	private function forTest2(array $ary)
	{
		// すべてのキーを配列として取得
		$keys = array_keys($ary);
		$count = count($keys);
		
		for ($i = 0; $i < $count; $i++) 
		{
			$key = $keys[$i];
			$value = $ary[$key];
			echo $key . ": " . $value . PHP_EOL;
		}
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
echo "</pre>";
copy
class test1
{
	//Data of a single associative array
	function test1()
	{
		$data=[
		'name' => "tanaka",
		'class' => 1,
		];
		echo "data count:".count($data).PHP_EOL;//data count:2
		echo "data.name:".$data["name"].PHP_EOL;//data.name:tanaka
		echo "data.class:".$data["class"].PHP_EOL;//data.class:1
		$this->changeArray($data, "class", 2);
		echo "data.class:".$data["class"].PHP_EOL;//data.class:2
		$this->deleteFieldArray1($data, "name");
		echo "data count:".count($data).PHP_EOL;//data count:1
		$this->foreachArray($data);
		//Result of foreach
		//class: 2
		
		$this->addArray($data, "age", 20);
		//Result of foreach
		//Class: 2
		//Age: 20
		
		$this->forTest1($data);
		//[Result]
		//Class: 2
		//Age: 20
		
		$this->forTest2($data);
		//[Result]
		//Class: 2
		//Age: 20
		
		$this->deleteFieldArray2($data, "class");
		$this->foreachArray($data);
		//Result of foreach
		//Age: 20
		
		$this->deleteFieldArray2($data, "age");
		$this->foreachArray($data);
		//Result of foreach
		//Nothing is displayed because there is no more data.
		echo "data count:".count($data).PHP_EOL;//data count:0
	}
	//How to read an array using foreach
	private function foreachArray(array $ary)
	{
		echo "foreachArray".PHP_EOL;
		foreach ($ary as $key => $value)
		{
		echo $key . ': ' . $value . PHP_EOL;
		}
	}
	// Change the specified key
	private function changeArray(array &$ary, string $key, int $value)
	{
		$ary[$key] = $value;
	}
	// Delete the specified key (using unset)
	private function deleteFieldArray1(array &$ary, string $key)
	{
		unset($ary[$key]);
	}
	// Delete the specified key (using array_diff_key)
	private function deleteFieldArray2(array &$ary, string $key)
	{
		// Define a new array containing the list of keys to delete
		$keys_to_remove = [$key];
		
		// array_diff_key() returns the result of removing the keys in the second argument from the array in the first argument
		$ary = array_diff_key($ary, array_flip($keys_to_remove));
	}
	// Delete the specified key (using array_filter)
	private function deleteFieldArray3(array &$ary, string $removeKey)
	{
		$ary = array_filter(
		$ary,
		function ($key) use ($removeKey) {
		// Return TRUE (keep) if the key does not match the key to be deleted.
		return $key !== $removeKey;
	},
	ARRAY_FILTER_USE_KEY // Flag to filter using the key.
	);
	
	}
	// Add data.
	private function addArray(array &$ary, string $key, int $value)
	{
		$ary[$key] = $value;
	}
	// Loop while manipulating the array's internal pointer.
	// Use reset() and next().
	// Not recommended for practical use due to poor readability and prone to bugs.
	private function forTest1(array $ary)
	{
		// Reset the pointer to the first element
		reset($ary);
		
		// Continue looping unless current() is false (or null, 0, etc.)
		for ($i = 0; current($ary) !== false; next($ary), $i++)
		{
			$key = key($ary);
			$value = current($ary);
			echo $key . ": " . $value . PHP_EOL;
		}
	}
	// Get all keys with array_keys(), then loop
	// Get a list of keys and use it as an index array in a for loop.
	private function forTest2(array $ary)
	{
		// Get all keys as an array
		$keys = array_keys($ary);
		$count = count($keys);
		
		for ($i = 0; $i < $count; $i++)
		{
			$key = $keys[$i];
			$value = $ary[$key];
			echo $key . ": " . $value . PHP_EOL;
		}
	}
}
echo "<pre>";
$cls1 = new test1();
$cls1->test1();
echo "</pre>";

方法特徴変更の有無推奨度合い
unset()シンプルで直接的。
最も一般的。
はい
array_diff_key()複数のキーを一括削除しやすい。
新しい配列を生成する。
いいえ
array_filter()柔軟な条件でフィルタリングできるが、少し複雑。いいえ


戻る

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