🌀

PHPとJSで配列を循環させる

2022/07/17に公開

modは言語によって特に負の引数での挙動が違うので, 使うたびに確認する羽目に. PHPとJSは負の引数でも同じ挙動でした. 今回はPHPとJSのmodを使って, 配列の添え字がオーバーフローしないようにうまく循環させます.

PHP

配列に渡すために-1 % 43になってほしいですね.

入力
for ($i=-10; $i<10; $i++) {
  echo $i, "\t", $i % 4, "<br>";
}
出力
-10 -2
-9 -1
-8 0
-7 -3
-6 -2
-5 -1
-4 0
-3 -3
-2 -2
-1 -1
0 0
1 1
2 2
3 3
4 0
5 1
6 2
7 3
8 0
9 1

循環させるには, 「4を足して絶対値を取ってからmodを計算」します. 正の引数では変化がありませんが, 負の引数では, うまく循環するようになっています.

入力
for ($i=-10; $i<10; $i++) {
  echo $i, "\t", abs($i+4) % 4, "<br>";
}
出力
-10 2
-9 1
-8 0
-7 3
-6 2
-5 1
-4 0
-3 1
-2 2
-1 3
0 0
1 1
2 2
3 3
4 0
5 1
6 2
7 3
8 0
9 1

実際に配列に渡した例です. a→b→c→d→a→b→… という循環がうまくできています.

入力
$A = ['a', 'b', 'c', 'd'];
for ($i=-10; $i<10; $i++) {
  echo $i, "\t", $A[abs($i+4) % 4], "<br>";
}
出力
-10 c
-9 b
-8 a
-7 d
-6 c
-5 b
-4 a
-3 b
-2 c
-1 d
0 a
1 b
2 c
3 d
4 a
5 b
6 c
7 d
8 a
9 b

JavaScript

PHPと同じ仕様のようです.

入力
for (let i=-10; i<10; i++) {
  console.log(i, i%4);
}
出力
-10 -2
-9 -1
-8 -0
-7 -3
-6 -2
-5 -1
-4 -0
-3 -3
-2 -2
-1 -1
0 0
1 1
2 2
3 3
4 0
5 1
6 2
7 3
8 0
9 1

循環させるには, 「4を足して絶対値を取ってからmodを計算」します. 正の引数では変化がありませんが, 負の引数では, うまく循環するようになっています.

入力
for (let i=-10; i<10; i++) {
  console.log(i, Math.abs(i+4)%4);
}
出力
-10 2
-9 1
-8 0
-7 3
-6 2
-5 1
-4 0
-3 1
-2 2
-1 3
0 0
1 1
2 2
3 3
4 0
5 1
6 2
7 3
8 0
9 1

実際に配列に渡した例です. a→b→c→d→a→b→… という循環がうまくできています.

入力
A = ['a', 'b', 'c', 'd'];
for (let i=-10; i<10; i++) {
  console.log(i, A[Math.abs(i+4)%4] );
}
出力
-10 'c'
-9 'b'
-8 'a'
-7 'd'
-6 'c'
-5 'b'
-4 'a'
-3 'b'
-2 'c'
-1 'd'
0 'a'
1 'b'
2 'c'
3 'd'
4 'a'
5 'b'
6 'c'
7 'd'
8 'a'
9 'b'

Discussion