配列内の条件に合致する要素を削除する。

たとえば

  $array = [2,3,4,5,8,9,12,10];

というような配列があったとして、その要素のうち偶数だけを削除したい場合はどうすれば良いかという問題です。

素直に考えると、

<?php

	$array = [2,3,4,6,8,9,12,10];
	
	for($i=0;$i < count($array);$i++){
		if(($array[$i]%2) == 0){
			array_splice($array,$i,1);
		}
	}

	
	foreach($array as $temp){
		echo($temp."\n");
	}
	
?>

とすれば良さそうなものですが、これではいけません。表示は、3,6,9,10となってしまいます。偶数である6,10が残ってしまっているのです。

その原因はarray_spliceにあります。ここで配列の要素を削除しているのですが、たとえばarray[1]を削除したとき、array[2]の要素がarray[1]に移動してしまいます(他の要素もそれに伴って前詰になります)。この場合、次に判定するべきarray[2]に入っている要素が、array[1]に移動しているため、当初array[3]に入っていた要素を判定してしまうのです。

これを解決するためにはいろいろ方法があると思いますが、一番シンプルなのは、配列の添え字が大きいほうから判定していくという方法です。これなら、要素が削除することによって中身がずれても関係ありません。だってズレたところは既に判定した要素なのですから!

以下、コードです。

<?php

	$array = [2,3,4,6,8,9,12,10];

	$len = count($array);
	
	for($i = $len-1;$i >= 0;$i--){
		if(($array[$i]%2) == 0){
			array_splice($array,$i,1);
		}
	}
	
	foreach($array as $temp){
		echo($temp."\n");
	}
	
?>