Writing Appropriately

職務経歴

PHP 配列再帰処理のarray_walk_recursiveとfilter_varの速度比較をしてみた

配列の再帰処理を見直すために速度を計測してみた。 array_walk_recursiveとfilter_varと自作再帰処理の3つ。 処理は全角空白と半角空白の削除で元の配列も残す方向。

<?php
function get_array() {
    return array(
        'zip' => ' 460 -0011 ',
        'address' => array(
            ' 愛知県名古屋市 ',
            ' 中区大須  ',
            ' ハンカク ジュウショ ',
        ),
    );
}

$funcA = function() {
    $array = get_array();
    $new = $array;
    array_walk_recursive($new, function(&$val, $key) {
        $val = str_replace(array(' ', ' '), '', $val);
    });
    // echo (__FILE__.':('.__LINE__.')'."\n".'$array='.print_r($array, true))."\n";
    // echo (__FILE__.':('.__LINE__.')'."\n".'$new='.print_r($new, true))."\n";
};

$funcB = function() {
    $array = get_array();
    $new = filter_var($array, FILTER_CALLBACK, ['options' => function ($val) {
        return str_replace(array(' ', ' '), '', $val);
    }]);
    // echo (__FILE__.':('.__LINE__.')'."\n".'$array='.print_r($array, true))."\n";
    // echo (__FILE__.':('.__LINE__.')'."\n".'$new='.print_r($new, true))."\n";
};

$funcC = function() {
    $array = get_array();
    $func = function(& $array) use( &$func){
        foreach ($array as & $val) {
            $type = gettype($val);
            if ('array' === $type OR 'object' === $type) {
                $func($val);
            }
            else {
                $val = str_replace(array(' ', ' '), '', $val);
            }
        }
    };
    $new = $array;
    $func($new);
    // echo (__FILE__.':('.__LINE__.')'."\n".'$array='.print_r($array, true))."\n";
    // echo (__FILE__.':('.__LINE__.')'."\n".'$new='.print_r($new, true))."\n";
};

//$funcA();
//$funcB();
//$funcC();
//exit;

$functions = array('A'=>$funcA, 'B'=>$funcB, 'C'=>$funcC);
foreach ($functions as $key => $func) {
    $start = microtime(true);
    for ($i = 0; $i < 100000; $i++ )  {
        $func();
    }
    $time = microtime(true) - $start;
    echo "{$key}: {$time}\n";
}

実行結果

A:array_walk_recursive、B:filter_var、C:自作再帰処理

A: 0.17630290985107 秒
B: 0.1960391998291 秒
C: 0.24357509613037 秒