Writing Appropriately

職務経歴

PHP 配列をオブジェクトっぽく扱うクラスを書いてみた

Larabelに配列をオブジェクトっぽく扱うクラスがあるという話を聞き、それを見てしまう前に自分の出せるものを出そうと思って書いてみた。 とりあえず現在やっている業務で必要となる形のものだけ。今後機能は増える。

  • 文字列にしか使えない関数を再帰的に実行
  • $obj->keyの書き方で値を取得できる
  • $obj->key = $val;の書き方で値を設定できる
  • メソッドチェーン(個人的には好みではないコピペしにくくなる)

github.com

テスト

<?php

require  dirname(__FILE__) . '/../ORE_Require.php';

$array = array(
    'hankaku' => 'ハンカクカタカナABC123',
    'lowercase' => 'abcdefg',
    'recursive' => array(
        'trim' => '  trim  ',
        'hoge1' => 'abcハンカクヘンカン',
        'hoge2' => 'edfハンカクヘンカン',
    ),
);
echo 'before ='.print_r($array, true)."\n";

$obj_arr = new ORE_Array($array);
$array = $obj_arr
    ->array_map('trim')
    ->strtoupper()
    ->mb_convert_kana('CKVas')
    ->get_array();

echo 'after  ='.print_r($array, true)."\n";


// キー値アクセス
echo '$obj_arr->hankaku='.$obj_arr->hankaku."\n";
echo '$obj_arr->lowercase='.$obj_arr->lowercase."\n";

// str_replace
$obj_arr->str_replace('ハンカクヘンカン', '全角になりました', true);
$array = $obj_arr->get_array();
echo 'str_replace ='.print_r($array, true)."\n";

結果

よきよき

f:id:naoyuki1019:20190514221549p:plain

そのうち

  • DBのテーブルのカラム名と同じkeyのみの配列を返すフィルタリング機能
  • ソート機能

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 秒