この記事の目的
未経験エンジニアが転職活動をする際、最初の難関となるのがコーディングテストです。ここを突破しないと面接にすら進めません。
極度のプレッシャーの中、素早く正確に問題を解くためには、「自分が使っている言語にどのような内部関数があるのか」「どうやって使うのか」などを事前に把握しておくことが必須と言えます。
そこで、コーディングテスト頻出の内部関数の使い方を、使用例を交えてわかりやすく正確にまとめることにしました。
本記事では、配列処理のための内部関数のみを取り上げます。その他の内部関数については、現在に別記事として執筆中です。
(※言語は全てPHPになります)
はじめに
早速ですが、本記事に登場する関数の一覧です。全部で17個の関数を取り上げます。
1. implode 配列要素を任意の文字列で連結する
2. array_push & 配列の末尾に要素を追加する
3. array_pop & 配列の末尾から要素を1つ取り除く
4. array_unshift & 配列の先頭に要素を追加する
5. array_shift & 配列の先頭から要素を1つ取り除く
6. array_merge ひとつまたは複数の配列をマージする
7. unset & 変数または配列の要素を削除する
8. array_slice 配列の一部を切り取った配列を返す
9. array_splice & 配列の一部を削除し、他の要素で置換する
10. array_reverse 要素を逆順にした配列を返す
11. sort & 配列を値の昇順にソートする
12. rsort & 配列を値の降順にソートする
13. ksort & 配列をキーの昇順にソートする
14. krsort & 配列をキーの降順にソートする
15. in_array 配列に値があるかチェックする(返り値はboolean)
16. array_search 指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す
17. array_keys 配列の全てのキー、または一部のキーを返す(ヒットした全てのキーを配列で返す)
本題
それでは、1つずつ順に解説していきます。
1. implode : 配列要素を任意の文字列で連結する
// 使用例
$array = ['lastname', 'email', 'phone'];
var_dump(implode(",", $array)); // string(20) "lastname,email,phone"
// 空の配列を使うと空文字列となる
var_dump(implode('hello', [])); // string(0) ""
// 第1引数 $separator を省略した場合は空文字で連結する
var_dump(implode(['a', 'b', 'c'])); // string(3) "abc"
2. array_push : & 配列の末尾に要素を追加する
// 使用例
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack);
// 出力結果は以下の通り
// Array
// (
// [0] => orange
// [1] => banana
// [2] => apple
// [3] => raspberry
// )
第1引数 $array
は参照渡しなので注意。
戻り値
処理後の配列の中の要素の数を返す。
もし配列にひとつの要素を加えるために array_push() を使用するなら、 関数を呼ぶオーバーヘッドがないので、
$array[] =
を使用するほうが良い。
3. array_pop : & 配列の末尾から要素を1つ取り除く
// 使用例
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_pop($stack);
echo $fruit; // raspberry
print_r($stack);
// 出力結果は以下の通り
// Array
// (
// [0] => orange
// [1] => banana
// [2] => apple
// )
第1引数 $array
は参照渡しなので注意。
戻り値
取り除いた配列要素の値を返す。
4. array_unshift : & 配列の先頭に要素を追加する
// 使用例
$queue = [
"orange",
"banana"
];
array_unshift($queue, "apple", "raspberry");
var_dump($queue);
// 出力結果は以下の通り
// array(4) {
// [0] =>
// string(5) "apple"
// [1] =>
// string(9) "raspberry"
// [2] =>
// string(6) "orange"
// [3] =>
// string(6) "banana"
// }
第1引数 $array
は参照渡しなので注意。
戻り値
処理後の配列の中の要素の数を返す。
5. array_shift : & 配列の先頭から要素を1つ取り除く
// 使用例
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack);
echo $fruit; // orange
print_r($stack);
// 出力結果は以下の通り
// Array
// (
// [0] => banana
// [1] => apple
// [2] => raspberry
// )
第1引数 $array
は参照渡しなので注意。
戻り値
取り除いた配列要素の値を返す。
6. array_merge : ひとつまたは複数の配列をマージする
// 使用例
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
// 出力結果は以下の通り
// Array
// (
// [color] => green // "green"で上書きされる
// [0] => 2
// [1] => 4
// [2] => a
// [3] => b
// [shape] => trapezoid
// [4] => 4
// )
二番目の配列の要素を最初の配列に追加したい (最初の配列に存在する要素は上書きせず、添字も変更しない) 場合は、配列結合演算子 + を使用すること。
$array1 = array(0 => 'zero_a', 2 => 'two_a', 3 => 'three_a');
$array2 = array(1 => 'one_b', 3 => 'three_b', 4 => 'four_b');
$result = $array1 + $array2;
var_dump($result);
// 出力結果は以下の通り
// 両方の配列に同じキーが存在する場合は最初の配列のものが残り、 二番目の配列の内容は無視される
// array(5) {
// [0]=>
// string(6) "zero_a"
// [2]=>
// string(5) "two_a"
// [3]=>
// string(7) "three_a"
// [1]=>
// string(5) "one_b"
// [4]=>
// string(6) "four_b"
// }
7. unset : & 変数または配列の要素を削除する
// 使用例
// 配列の要素の一つを破棄する
unset($bar['foo']);
8. array_slice : 配列の一部を切り取った配列を返す
// 使用例
$input = array("a", "b", "c", "d", "e");
$output = array_slice($input, 2); // "c", "d", "e" を返す
$output = array_slice($input, -2, 1); // "d" を返す
$output = array_slice($input, 0, 3); // "a", "b", "c" を返す
第4引数 $preserve_keys
について
array_slice() はデフォルトで配列の数値キーを並べなおし、 リセットする。
しかし、preserve_keys を true にする事でこの動作を変更することができ、 文字列のキーはこのパラメータの値にかかわらず保存されるようになる。
$input = array("a", "b", "c", "d", "e");
// 配列キーの違いに注意
print_r(array_slice($input, 2, -1));
// Array
// (
// [0] => c
// [1] => d
// )
print_r(array_slice($input, 2, -1, true)); // 第4引数に true を渡す
// Array
// (
// [2] => c
// [3] => d
// )
9. array_splice : & 配列の一部を削除し、他の要素で置換する
// 使用例1
// これは「置換」を行う
$input = array("red", "green", "blue", "yellow");
array_splice($input, -1, 1, array("black", "maroon"));
var_dump($input);
// array(5) {
// [0]=>
// string(3) "red"
// [1]=>
// string(5) "green"
// [2]=>
// string(4) "blue"
// [3]=>
// string(5) "black"
// [4]=>
// string(6) "maroon"
// }
// 使用例2
// これは「挿入」を行う
$input = array("red", "green", "blue", "yellow");
array_splice($input, count($input), 0, array("black", "maroon"));
var_dump($input);
// array(6) {
// [0]=>
// string(3) "red"
// [1]=>
// string(5) "green"
// [2]=>
// string(4) "blue"
// [3]=>
// string(6) "yellow"
// [4]=>
// string(5) "black"
// [5]=>
// string(6) "maroon"
// }
// 使用例3
// これは「削除」を行う
$input = array("red", "green", "blue", "yellow");
array_splice($input, 2);
var_dump($input);
// array(2) {
// [0]=>
// string(3) "red"
// [1]=>
// string(5) "green"
// }
ポイント
array_splice() は、基本的には「置換」を行う。
ただし、$length
= 0 の場合は「挿入」を行う。
$replacement
が省略された場合は「削除」を行う。
第1引数 $array
は参照渡しなので注意。
配列の数値添字は保存されないので注意。(※ 文字列添字は保存される)
10. array_reverse : 要素を逆順にした配列を返す
// 使用例
$input = ['first', 'second', 'third'];
$reversed = array_reverse($input);
$preserved = array_reverse($input, true);
print_r($reversed);
// Array
// (
// [0] => third
// [1] => second
// [2] => first
// )
print_r($preserved);
// Array
// (
// [2] => third
// [1] => second
// [0] => first
// )
11. sort : & 配列を値の昇順にソートする
// 使用例
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits); // アルファベットの昇順にソート
foreach ($fruits as $key => $val) {
echo "fruits[" . $key . "] = " . $val . "\n";
}
// 出力結果は以下の通り
// fruits[0] = apple
// fruits[1] = banana
// fruits[2] = lemon
// fruits[3] = orange
第1引数 $array
は参照渡しなので注意。
比較結果が等しくなる二つの要素があった場合、それらの並び順は保持される。
戻り値
戻り値は常に true 。
sort() を使用すると、配列のキー情報は全て削除され、新しいキーが割り当てられる。
連想配列のキーを保持したい場合は、代わりに asort() を使用する。
12. rsort : & 配列を値の降順にソートする
// 使用例
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits); // アルファベットの昇順にソート
foreach ($fruits as $key => $val) {
echo "fruits[" . $key . "] = " . $val . "\n";
}
// 出力結果は以下の通り
// fruits[0] = orange
// fruits[1] = lemon
// fruits[2] = banana
// fruits[3] = apple
第1引数 $array
は参照渡しなので注意。
比較結果が等しくなる二つの要素があった場合、それらの並び順は保持される。
戻り値
戻り値は常に true 。
sort() を使用すると、配列のキー情報は全て削除され、新しいキーが割り当てられる。
連想配列のキーを保持したい場合は、代わりに arsort() を使用する。
13. ksort : & 配列をキーの昇順にソートする
// 使用例
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits);
foreach ($fruits as $key => $val) {
echo "$key = $val\n";
}
// 出力結果は以下の通り
// a = orange
// b = banana
// c = apple
// d = lemon
第1引数 $array
は参照渡しなので注意。
戻り値
戻り値は常に true 。
14. krsort : & 配列をキーの降順にソートする
// 使用例
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
krsort($fruits);
foreach ($fruits as $key => $val) {
echo "$key = $val\n";
}
// 出力結果は以下の通り
// d = lemon
// c = apple
// b = banana
// a = orange
第1引数 $array
は参照渡しなので注意。
戻り値
戻り値は常に true 。
15. in_array : 配列に値があるかチェックする(返り値はboolean)
// 使用例
$os = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
echo "Got Irix"; // 出力される
}
if (in_array("mac", $os)) {
echo "Got mac"; // 大文字小文字が区別されるので、出力されない
}
第1引数 $needle
が文字列の場合、 比較の際に大文字小文字は区別される。
16. array_search : 指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す
// 使用例
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');
$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array); // $key = 1;
第1引数 $needle
が文字列の場合、 比較の際に大文字小文字は区別される。
戻り値
$needle
が見つかった場合、見つかった最初の配列キーを返す。 見つからなかった場合、 false を返す。
17. array_keys : 配列の全てのキー、または一部のキーを返す(ヒットした全てのキーを配列で返す)
// 使用例1
$array = array(0 => 100, "color" => "red");
print_r(array_keys($array)); // 全てのキーを返す
// 出力結果は以下の通り
// Array
// (
// [0] => 0
// [1] => color
// )
// 使用例2
$array = array("blue", "red", "green", "blue", "blue");
print_r(array_keys($array, "blue")); // 指定した値のキーのみ返す
// 出力結果は以下の通り
// Array
// (
// [0] => 0
// [1] => 3
// [2] => 4
// )
// 使用例3
$array = array("color" => array("blue", "red", "green"),
"size" => array("small", "medium", "large"));
print_r(array_keys($array));
// 出力結果は以下の通り
// Array
// (
// [0] => color
// [1] => size
// )
以上になります。
コーディングテストに頻出の内部関数について知っておくことは、スピーディに問題を解くために必要不可欠です。
今回紹介した5個の内部関数をしっかり覚えておきましょう!
別記事にて「文字列処理関数」「数値処理関数」についても解説してますので、そちらも参考にして下さい!