🙆
【PHP】競プロで使えるかもしれない小ネタ(Array編)
はじめに
PHPで競プロするときに役に立つかもしれない小ネタを集めました。
1. 配列をシフトしながら循環させる
<?php
$nums = [1,2,3,4,5];
$l = count($nums);
for ($i = 0; $i < $l; $i++) {
$result = array_map(function($j) use ($i, $l, $nums) {
return $nums[($i + $j) % $l];
}, range(1, $l));
echo json_encode($result).PHP_EOL;
/*
[2,3,4,5,1]
[3,4,5,1,2]
[4,5,1,2,3]
[5,1,2,3,4]
[1,2,3,4,5]
*/
}
?>
2. スライス
<?php
// 例えば下記「3」以外の配列を取る
$list = [1,2,3,4,5,6];
$newarray = array_merge(array_slice($list, 0, 2), array_slice($list, 2+1));
print_r($newarray);
/*
[1,2,4,5,6]
*/
?>
3. 2つの配列に共通する値を取得する
文字の出現頻度(回数)を数えたり、「文字列Aの文字を入れ替えて文字列Bが作れるか」みたいな問題で使う。
<?php
$mojiretsu = "anagram";
$hashMap = [];
foreach (str_split($mojiretsu) as $char) {
// null合体演算子でキーに対する値の存在をチェックする
$hashMap[$char] = ($hashMap[$char] ?? 0) + 1;
}
echo json_encode($hashMap);``php
/*
{"a":3,"n":1,"g":1,"r":1,"m":1}
*/
?>
4. 2次元配列の縦横並び替え(転置)
<?php
$grid = [[1,2,4],[3,3,1]];
echo json_encode(array_map(null, ...$grid)).PHP_EOL;
// [[1,3],[2,3],[4,1]]
5. リスト内の0を後方へシフトする
<?php
$nums = [1, 0, 2, 0, 3];
usort($nums, fn ($a, $b) => {
return ($a == 0) <=> ($b == 0);
});
echo json_encode($nums);
// [1,2,3,0,0]
Discussion