アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

複数の文字列データをカンマ区切りにするけど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の方が遅い。