複数の文字列データをカンマ区切りにするけど5データごとに改行する
関数化した。
<?php function str_chunk($list, $size) { return implode("\n", array_map(function($l){return implode(",", $l);}, array_chunk($list, $size))); }
…。
読みにくいのは置いといて使い方と結果はこんな感じ。
<?php $data_list = array("a","b","c","d","e","f","g","h","j","i","k","l","m",); echo str_chunk($data_list, 5);
a,b,c,d,e f,g,h,j,i k,l,m
やったね。めでたしめでたし。
念のため、カンマと改行文字は引数に渡せるようにしてみる
<? function str_chunk($list, $size, $del1 = ",", $del2 = "\n") { return implode($del2, array_map(function($l, $d){return implode($d, $l);}, array_chunk($list, $size), array_fill(0, count(array_chunk($list, $size)), $del1))); }
さすがにアホではないだろうか?
動いたけど。
array_mapは便利だけど、array(1,2,3)のそれぞれに2を掛けたい、というときに
array(1,2,3)とarray(2,2,2)とかいう無駄引数を渡さなきゃいけない。
(そのための array_fill(0, count(array_chunk($list, $size)), $del1) というクソ表記)
じゃあもうarray_mapとか投げ捨ててforeachでよくない?
<?php function str_chunk($list, $size, $del1 = ",", $del2 = "\n") { $chunk_list = array_chunk($list, $size); $str_list = array(); foreach ($chunk_list as $k => $v) { $str_list[] = implode($del1, $v); } return implode($del2, $str_list); }
読みやすくなった。
ついでに速度検証
array_map版(区切り文字指定できる方)とforeach版の速度比較。
データはサンプルコードにあるa~mの13文字、
10万回実行を5セットした平均値。
array_map版:296.5834
foreach版:269.9892
単位はミリ秒。
まあ誤差レベルだけどarray_mapの方が遅い。