LoginSignup
3
3

More than 5 years have passed since last update.

PHPでカンマ区切りの文字列を配列にして整形する

Last updated at Posted at 2018-02-01

array_functionsより通常のループの方がパフォーマンスが良いそうです。
http://www.levijackson.net/are-array_-functions-faster-than-loops/
https://stackoverflow.com/questions/18144782/performance-of-foreach-array-map-with-lambda-and-array-map-with-static-function#answer-26527704

foreach例

$string = " , , あ, い, う\t\n\r,え,お か,き く,け";
$list = explode(',', $string);
$new_list = [];
foreach ($list as $value)
{
    $value = mb_ereg_replace('^[\s ]+|[\s ]+$', '', $value);
    if ($value !== "")
    {
        $new_list[] = $value;
    }
}

var_dump($new_list);
array(7) {
  [0]=>
  string(3) "あ"
  [1]=>
  string(3) "い"
  [2]=>
  string(3) "う"
  [3]=>
  string(3) "え"
  [4]=>
  string(7) "お か"
  [5]=>
  string(9) "き く"
  [6]=>
  string(3) "け"
}

array_functions例

(foreachに比べて回す回数が多いので良くないのかも?)

$string = " , , あ, い, う\t\n\r,え,お か,き く,け";
$list = explode(',', $string);
$list = array_map(function ($value) {
    return mb_ereg_replace('^[\s ]+|[\s ]+$', '', $value);
}, $list);
$list = array_filter($list, function ($value) {
    return $value !== "";
});
$list = array_merge($list);

var_dump($list);
array(7) {
  [0]=>
  string(3) "あ"
  [1]=>
  string(3) "い"
  [2]=>
  string(3) "う"
  [3]=>
  string(3) "え"
  [4]=>
  string(7) "お か"
  [5]=>
  string(9) "き く"
  [6]=>
  string(3) "け"
}

自分でもパフォーマンスが気になったので試してみました。

パフォーマンス確認

ここで確認

array_functions系

$start = microtime(true);
foreach(range(0, $loop_count) as $value)
{
    $string = " , , あ, い, う\t\n\r,え,お か,き く,け";
    $list = explode(',', $string);
    $list = array_map(function ($value) {
        return mb_ereg_replace('^[\s ]+|[\s ]+$', '', $value);
    }, $list);
    $list = array_filter($list, function ($value) {
        return $value !== "";
    });
    $list = array_merge($list);
}
$end = microtime(true);
var_dump(sprintf('%f', $end - $start));

array_functions系3回を1セットで10000ループ

0.2~0.3秒程度

array_functions系3回を1セットを1ループ

0.000090~0.000200秒程度

foreach

$start = microtime(true);
foreach(range(0, $loop_count) as $value)
{
    $string = " , , あ, い, う\t\n\r,え,お か,き く,け";
    $list = explode(',', $string);
    $new_list = [];
    foreach ($list as $value)
    {
        $value = mb_ereg_replace('^[\s ]+|[\s ]+$', '', $value);
        if ($value !== "")
        {
            $new_list[] = $value;
        }
    }
}
$end = microtime(true);
var_dump(sprintf('%f', $end - $start));

foreach1回を1セットで10000ループ

0.14~0.25秒程度

foreach1回を1セットで1ループ

0.000074~0.000170秒程度

結果

array_functionsを数パターン駆使して実装したものとforeachで一括で実装したものを
10000週程すると差が出てきたのははっきりとわかりました。

何週も回す処理でない限りパフォーマンスの差は殆ど出ないので1回だけの普通の処理を実装するなら見やすいほうだったりと好きな方で良いかなと思います。
しかし、実際に業務で使うようなCSV(パースはCSV用の関数を使ってください)は件数も多い(ループが多い)と思いますのでforeachでまとめて処理といった感じになるとおもいます。

3
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3