🙆

【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