【foreach ($abc as $i => $v) $new[$i % $max][] = $v;】
$i % $max は剰余を計算するので、$maxが7であるとすると、以下のような順序でループします。
0 % 7 → 0
1 % 7 → 1
2 % 7 → 2
3 % 7 → 3
4 % 7 → 4
5 % 7 → 5
6 % 7 → 6
0 % 7 → 0
1 % 7 → 1
2 % 7 → 2
...
「もしくは、...という割り振り方でも大丈夫です」ということでしたので、実装しやすいこちらを選びました。
--------------------------------------------
【$new = array_map(function ($vl) { return implode(', ', $vl); }, $new);】
こちらは2次元配列の中に作成された1次元配列を、「, 」で結合しているだけです。
array(
array('A', 'H'),
array('B', 'I'),
array('C'),
array('D'),
array('E'),
array('F'),
array('G'),
)
これが
array(
'A, H',
'B, I',
'C',
'D',
'E',
'F',
'G',
)
こうなります。
function ($vl) { return implode(', ', $vl); }
という無名関数を内側の各配列に対して適用し、returnされてきた文字列を新しい配列にセットしていく感じです。キーはそのまま使用されます。まあ分かりにくかったら
[A]
$new = array();
$max = count($abc);
foreach ($abc as $i => $v) $new[$i % $max][] = $v;
foreach ($new as &$v) $v = implode(', ', $v);
unset($v);
もしくは
[B]
$new = array();
$max = count($abc);
foreach ($abc as $i => $v) $new[$i % $max][] = $v;
foreach ($new as $i => $v) $new[$i] = implode(', ', $v);
と書くのもナシでは無いです。ただ
[A]…「外側でunsetしないと次に$vという変数に代入したときに$newが破壊される」
[B]…「PHPのforeachの実装を理解していないと、現在回している配列自体を書き換えたときの挙動が理解しにくい」
という欠点があります。
--------------------------------------------
【その他】
まずはマニュアルで気になった関数の使い方を読んでみてください。
[配列関数]
http://php.net/manual/ja/ref.array.php
メリットがよく分からなければ、以下の記事を読んでみるといいと思います。
[PHPでできる関数型プログラミング]
http://my-rest.icca.jp/blog/2011/01/477/
http://my-rest.icca.jp/blog/2011/01/506/
http://my-rest.icca.jp/blog/2011/02/524/
PHPは関数型言語寄りの記述があまり得意ではないので、狂ったみたいにこの書き方に拘る必要はもちろん無いと思います。あくまで「ここは関数型っぽく書いた方がきれいに書ける!」と感じたら採用すればいい程度です。
以下はカレンダーの2次元配列を作成する例ですが、圧倒的に関数型の方がきれいに書ける一例です。
[最もシンプルなカレンダー生成ロジック]
http://qiita.com/mpyw/items/0a475bc4891a3a2940e8
ちなみに今回の問題をRubyで解決するならば以下のように書けますね。Rubyはあんまり詳しくないのでもっといい書き方とかあるかもしれませんが、これだけでも十分綺麗に書けてるとは思います。
abc = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
new = abc
.each_with_index
.group_by{|v, k| k % 7}
.values
.map{|v| v.map(&:first)}
お礼
任意の数字で割るには、$maxの数値を書き換えればいいわけですね。 余りが0から増えていったり、一度2次元配列にして、,でつないで1次元の配列に戻すみたいなやり方は全く発想になかったので、とても勉強になります。 リンクもありがとうございます。 マニュアルや、関数型プログラミングのページ読んでみます。 大変詳しくありがとうございました。