現在の言語: 日本語

戻る

配列の要素削除
配列関連

配列のデータを削除するには、
unset()
array_splice()
array_filter()
array_diff()
など目的にあった関数があります。

しかし、使用した関数によっては削除した結果のインデックスが欠番状態になっているため
プログラムの仕方によってはインデックスを振り直さないとエラーになる可能性があります。

[サンプル]

copy
class test1
{
	function test1():void
	{
		$ary =[1,2,3];
		unset($ary[1]);
		print_r($ary);
/*
Array
(
    [0] => 1
    [2] => 3
)
*/
		//count を計算し、添字でアクセスした場合
		//上記の配列ではインデックスが1を削除したため
		//下記のようにfor文でcount関数を使用して実行するとエラーになります
/*
		for($i=0; $i 1
    [1] => 3
)
*/
		$data=[
			'name' => "tanaka",
			'class' => 1,
		];
		unset($data["name"]);
		print_r($data);
/*
Array
(
    [class] => 1
)
*/
	}
	function test2():void
	{
		//指定した位置から指定した数の要素を削除します。
		//複数削除や、削除と同時に値を挿入することも可能で、インデックスも自動で詰められます。
		$ary1 = ['a', 'b', 'c', 'd'];
		array_splice($ary1, 1, 2); 
		print_r($ary1);
/*
Array
(
    [0] => a
    [1] => d
)
*/
		//配列の末尾の要素を削除します。
		$ary2 = ['a', 'b', 'c'];
		array_pop($ary2); 
		print_r($ary2);
/*
Array
(
    [0] => a
    [1] => b
)
*/
		//配列の先頭の要素を削除します。
		$ary3 = ['a', 'b', 'c'];
		array_shift($ary3);
		print_r($ary3);
/*
Array
(
    [0] => b
    [1] => c
)
*/
		//渡した値と一致する値を持つ要素を削除します(キーは保持)。
		$ary4 = ['apple', 'banana', 'orange'];
		$ary4 = array_diff($ary4, ['banana']);
		print_r($ary4);
/*
Array
(
    [0] => apple
    [2] => orange
)
*/
		//条件に合う要素だけを残す(=条件に合わない空の要素などを削除する)のに使います。
		$ary5 = [0, 1, 2, null, 3];
		$ary5 = array_filter($ary5);
		print_r($ary5);
/*
Array
(
    [1] => 1
    [2] => 2
    [4] => 3
)
*/
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
echo "</pre>";
copy
class test1
{
	function test1():void
	{
		$ary =[1,2,3];
		unset($ary[1]);
		print_r($ary);
/*
Array
(
[0] => 1
[2] => 3
)
*/
	/Calculating count and accessing it by index
	//In the above array, index 1 has been deleted.
	//Using the count function in a for statement like the one below will result in an error.
/*
for($i=0; $i 1
[1] => 3
)
*/
	$data=[
	'name' => "tanaka",
	'class' => 1,
	];
	unset($data["name"]);
	print_r($data);
/*
Array
(
[class] => 1
)
*/
	}
	function test2():void
	{
		// Deletes the specified number of elements from the specified position.
		// Multiple deletions and simultaneous insertions are also possible, and indexes are automatically adjusted.
		$ary1 = ['a', 'b', 'c', 'd'];
		array_splice($ary1, 1, 2);
		print_r($ary1);
/*
Array
(
[0] => a
[1] => d
)
*/
		// Deletes the last element of the array.
		$ary2 = ['a', 'b', 'c'];
		array_pop($ary2);
		print_r($ary2);
/*
Array
(
[0] => a
[1] => b
)
*/
		// Remove the first element from the array.
		$ary3 = ['a', 'b', 'c'];
		array_shift($ary3);
		print_r($ary3);
/*
Array
(
[0] => b
[1] => c
)
*/
		// Remove the element whose value matches the passed value (preserving the key).
		$ary4 = ['apple', 'banana', 'orange'];
		$ary4 = array_diff($ary4, ['banana']);
		print_r($ary4);
/*
Array
(
[0] => apple
[2] => orange
)
*/
		//Used to keep only elements that meet the condition (i.e., remove empty elements that do not meet the condition).
		$ary5 = [0, 1, 2, null, 3]; 
		$ary5 = array_filter($ary5); 
		print_r($ary5);
/*
Array
( 
[1] => 1 
[2] => 2 
[4] => 3
)
*/ 
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
echo "</pre>";
unset最速
配列のハッシュテーブルから指定されたキーを削除するだけの処理なので、
最もオーバーヘッドが少ないです。
削除した後にインデックス(添字)を詰めません。
連想配列や、添字が飛んでも問題ない場合に最適です。
array_splice中速
要素を削除した後、後続の要素を前へ詰めて
インデックスを振り直す処理が発生するため、
unset よりは低速です。
削除後に添字を 0, 1, 2... と連続した状態に保ちたい場合に適しています。
array_filter低速
全ての要素に対してコールバック関数を実行するため、
関数の呼び出しコストがかかります。
「特定の条件に合うものを一括で消したい」など、
複雑な条件判定が必要な場合に使います。
array_diff最も低速
内部的に比較用の新しい配列を生成し、
全要素を比較して差分を算出するため、
単一要素の削除には不向きです。
「この値リストに含まれるものを全て削除したい」
といった集合操作に適しています。
※上記関数を実行するとインデックス(キー)は欠番になります。
そしてarray_valuesを実行することでインデックスが振り直されます。
ちなみにarray_spliceやarray_shift関数を実行した場合はインデックス(キー)は自動で振り直されます。


戻る

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