[PHPメモ][正規表現]定型のフォーマットから任意の文字抽出する

定型のフォーマットから任意の文字を抽出する正規表現


$infos = [
    '氏名:西住 みほ 所属:アンコウチーム 役職:車長',
    '氏名:秋山 優花里 所属:アンコウチーム 役職:装填手',
    '氏名:武部 沙織 所属:アンコウチーム 役職:通信手',
    '氏名:五十 鈴華 所属:アンコウチーム 役職:砲手',
    '氏名:冷泉 麻子 所属:アンコウチーム 役職:操縦手',
    '氏名:角谷 杏 所属:カメさんチーム 役職:車長',
    '氏名:小山 柚子 所属:カメさんチーム 役職:操縦手',
    '氏名:河嶋 桃 所属:カメさんチーム 役職:乗車用ステップ',
];

$match = '/^氏名:(.+) 所属:(.+) 役職:(.+)$/';
$rep = '$1';

$result = preg_replace($match, $rep, $infos);
print_r(result); 
// 出力結果
//Array
//(
//    [0] => 西住 みほ
//    [1] => 秋山 優花里
//    [2] => 武部 沙織
//    [3] => 五十 鈴華
//    [4] => 冷泉 麻子
//    [5] => 角谷 杏
//    [6] => 小山 柚子
//    [7] => 河嶋 桃
//)

[$1]の記述で、1つ目の(.+)にマッチした箇所を抽出できる。
$2、$3と記述を変えれば、所属、役職の情報も抽出可能

[PHPメモ][shuffle]配列のキーを維持したままShuffle

配列の要素をランダムに入れ替えたい場合、PHPでは[shuffle]の関数が用意されているが、この関数では配列のキーは維持できない。
配列のキーを維持したまま、ランダムに入れ替えたい時は[uasort](または[uksort])の機能を利用する。


// キーを保持したままランダムに要素を入れ替
// ユーザ定義のソート関数と、乱数生成関数を 組み合わせて利用する
uasort($array, function() {
    return mt_rand(-1, 1);
});

一般的な[uasort]の使用例


// メーカーIDをキーとした、メーカー名の配列を定義
$array = [
    1 => 'Toyota',
    2 => 'Honda',
    3 => 'Nissan',
    99 => 'Other'
];
// 「Other」を最後尾に配置した上で、メーカー名の順にソート
uasort($array, function($a, $b) {
    if ($a === 'Other') {
        return 1;
    }
    
    if ($b === 'Other') {
        return -1;
    }
    
    return strnatcmp($a, $b);
});

print_r($array);
// 出力結果
//Array
//(
//    [2] => Honda
//    [3] => Nissan
//    [1] => Toyota
//    [99] => Other
//)

[PHPメモ]array_mapで[for]

forの処理を[array_map]でシンプルに記述

簡単な処理なら、コールバック関数を利用してサクッと書けます。


$before = [
    '西住 みほ',
    'ダージリン',
    'ケイ',
    '安斎 千代美',
    'カチューシャ',
    '西住 まほ',
];

$after = array_map(function($name) {
    return $name === 'ダージリン'? 'ダー様': $name;
}, $before);

print_r($after);
// $after 出力
//[
//    '西住 みほ',
//    'ダー様',
//    'ケイ',
//    '安斎 千代美',
//    'カチューシャ',
//    '西住 まほ',
//];

使う利点は、変数宣言と加工処理のスコープを分けることで、コードの可読性が上がること。
また、配列の加工処理でindexが処理内容に影響しないことも明示できる。

長期に渡り運用、改修されるプロジェクトでは、コードの可読性が後の改修工数に大きな影響を与える。
可読性を意識することで、後々の改修担当がコードの処理を理解する工数を短縮できる。

但し、[array_map]は速度的に[for]、[foreach]に劣るため、バッチ処理で大量データを加工する場合など、処理速度が優先される場面では避けた方が良い。

なんとなくカッコいいからといって、なんでもかんでも、[array_map]を使えば良いとい言うわけでは無い。

[for]を使って普通に書いた場合はこんな感じ


$before = [
    '西住 みほ',
    'ダージリン',
    'ケイ',
    '安斎 千代美',
    'カチューシャ',
    '西住 まほ',
];

$after = [];
for ($i = 0, $cnt = count($before); $i < $cnt; ++$i) {
    $after[] = $before[$i] === 'ダージリン'? 'ダー様': $before[$i];
} 

print_r($after);
// $after 出力
//[
//    '西住 みほ',
//    'ダー様',
//    'ケイ',
//    '安斎 千代美',
//    'カチューシャ',
//    '西住 まほ',
//];

CakePHP3のフォルダ拡張方法

CakePHP2からCakePHP3への変更点の人つとして、フォルダの拡張方法が大きく変わった。

Cake2では[app/Config/bootstrap.php]の設定で行っていたが、Cake3ではcomposerの利用を前提とした仕様に変わったため、この設定がなくなった。

Cake3では[composer.json]と[config/app.php]でフォルダの拡張を行う。

[composer.json]
各種クラスはこちらで設定する。


    "autoload": {
        "psr-4": {
            "App\\": [
                "models/Master",
                "models/User",
                "models/Common",
                "apps/Auth",
                "apps/Admin",
                "apps/Manager",
                "apps/Operator",
                "apps/Customer",
                "apps/Common",
                "apps/Api",
                "src"
            ]
        }
    },

上記の例では、[app]のフォルダを用途別に分類している。

[config/app.php]
クラス以外のViewテンプレートはこちらで設定する。


    'App' => [
        'namespace' => 'App',
                ーーーーー省略ーーーーー
        'paths' => [
            'plugins' => [ROOT . DS . 'plugins' . DS],
            'templates' => [
                APP . 'Template' . DS,
                ROOT . DS . 'apps' . DS . 'Auth' . DS . 'Template' . DS,
                ROOT . DS . 'apps' . DS . 'Admin' . DS . 'Template' . DS,
                ROOT . DS . 'apps' . DS . 'Manager' . DS . 'Template' . DS,
                ROOT . DS . 'apps' . DS . 'Operator' . DS . 'Template' . DS,
                ROOT . DS . 'apps' . DS . 'Customer' . DS . 'Template' . DS,
                ROOT . DS . 'apps' . DS . 'Common' . DS . 'Template' . DS,
                ROOT . DS . 'apps' . DS . 'Api' . DS . 'Template' . DS,
            ],
            'locales' => [APP . 'Locale' . DS],
        ],
    ],