ボム君.com

Masa's blog

今まで学んできたITスキルを主に。

PHPで、配列の中身の一部分だけを削除したい場合

PHPでの配列に対する関数っていうものはたくさんあって、


PHPのドキュメンテーションにも色々記述されているようですが、



ここではよく使う関数を元に、解決策を見つけていこいうと思います。


配列の中身をまずはどうなっているか、確認します。


配列の中身全てを出力させるには、PHPのプリント関数である、「print_r 」を使います。

<?php
$arr = array(1,2,3,4,5,6,7,8,9);
print_r($arr);
?>

上記のように、「print_r」を使えば、下記にように配列が出力します。

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 )

配列には、インデックスがあり、一つ一つの値が「=>」の後に出力しています。



では内容の確認が取れましたので、ここから本題です。

中身を削除する

プログラムを書いてるうちに、配列の中身を削除したい、消したい、取り出しでまた新しい配列を作りたい、などの問題に直面すると思います。

そんな時のために、PHPでは配列に対する関数がいくつか用意されています。

array_diff_key()

どの位置(インデックス、またはキー)を削除したいか、わかっている場合はこの関数がオススメです。


例えば下記のように、一番左と左から三番目の値を削除したかったら、このように書きます。

<?php
$array = array(1,2,3,4,5,6,7,8,9);
$array = array_diff_key($array, [0 => "なんでもいい", "2" => "なんでもいい"]);
print_r($array);
?>


上の出力はこのようになります。

Array ( [1] => 2 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 )

1と3がちゃんと消されてますね。


array_dif()

どの位置(インデックス、またはキー)を削除したいか、わからなかった場合は、

array_dif()関数を使います。

<?php
$array = array(1,2,3,4,5,6,7,8,9);
$array = array_diff($array, [1, 2]);
print_r($array);
?>

これもとても簡単で、関数内に、配列と、削除したい値をあげれるだけです。

上のコードの出力はこのようになります。

Array ( [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 )

見ての通り、1と2が消されてますね。


array_values()

ここで注意です。


上の二つの方法さえ理解し、覚えていれば、配列上の削除は問題なく、かけるようになると思いますが、


やはり、ここで、気づく人もいるかもしれません。


削除された後の配列をようく見てみてください。


インデックスの数が変わっていないことにお気づきでしょうか。


例えば、

配列A   :$array = array(1,2,3,4,5,6,7,8,9);
後の配列A :Array ( [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 ) 

値が3のインデックスは「0」ではなく、元の位置である「2」が置かれています。


本来ならば、この場合、ループで、新しい配列に移動し、インデックスを作り直すといった感じの方法をやると思いますが、


PHPではこういった問題に直面した場合の解決策がすでに作られています。



その関数がarray_values()です。

<?php
$array = array(1,2,3,4,5,6,7,8,9);
$array = array_values(array_diff($array, [1, 2]));
print_r($array);
?>

出力

Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 6 [4] => 7 [5] => 8 [6] => 9 )

このように配列を出力させる前に、その配列をarray_valuesにぶち込めておけば、このPHP配列関数が

勝手に整理してくれるっていうことになります。

とても便利で、よく使う関数の一つですので、ぜひ覚えて活用してください。


では。