トップページに戻る    Cマガ電脳クラブで勉強したこと    オートコンプリート    LINQに対応した配列の操作    正規表現メモ    サクラエディタの設定

PHPメモ


目次

001. WindowsXPでのPHP環境構築
002. ログ出力
003. 日付の書式変換
004. C#のラムダ式っぽい関数定義
005. array_filter関数
006. preg_match関数とpreg_match_all関数
007. preg_replace関数
008. ctype_digit関数
009. array_map関数で再帰呼び出し
010. 複数変数のデバッグ表示用の配列定義
011. 独習PHPの読書メモその1 関数やクラスのスコープ
012. 独習PHPの読書メモその2 $GLOBALSという連想配列
013. 独習PHPの読書メモその3 use命令
014. 独習PHPの読書メモその4 header関数でのLocationヘッダ出力のHTTPステータス
015. 独習PHPの読書メモその5 clone命令
016. PHPでの配列型の代入は、ディープコピー
017. array_search関数
018. array_keys関数とarray_values関数
019. number_format関数
020. 開発時の500エラーの原因調査用
021. シリアライズとデシリアライズ
022. 条件演算子は短絡評価
023. DateTime型の当日取得の注意点
024. isset関数でネストした配列の添字チェック
025. goto文でif文の指定位置に移動
026. for文で連番作成


001 WindowsXPでのPHP環境構築

WindowsXP(SP2)で動くPHPの最新バージョンは、5.4.45

古い Windows システムへのインストール
5.4.45の非スレッドセーフ版で動作を確認

コマンドプロンプトで下記のようにして、PHPの実行が可能
D:\php\php-5-4-45>php D:\WorkFile\hello.php
HelloWorld
HelloPHP


002 ログ出力

ini_set('log_errors',1);
error_reporting(E_ALL);


003 日付の書式変換

date_default_timezone_set('Asia/Tokyo');
echo (new DateTime('2018-09-01'))->format('Y/n/j');


004 C#のラムダ式っぽい関数定義

$wk_func = function($p){
    echo $p;
};

$wk_func('123');


005 array_filter関数

array_filter関数の第3引数にARRAY_FILTER_USE_KEYやARRAY_FILTER_USE_BOTH
を指定する使い方もある。

<?php
$wk_arr = array('a','b','c','d','e');
$new_arr = array_filter($wk_arr,
                        function($pVal){
                            return $pVal == 'a' || $pVal == 'c';
                        });
var_export($new_arr); // array (0 => 'a', 2 => 'c',)

下記のように、use命令を引数のfunctionで指定する使い方もある。

<?php
function TestFunc()
{
    $FilterVal = 50;
    $TestArr = [50,100];

    $new_arr = array_filter($TestArr,
                            function($pVal) use($FilterVal) {
                                return $pVal == $FilterVal;
                            });
    var_export($new_arr); // array (0 => 50,)
}
TestFunc();


006 preg_match関数とpreg_match_all関数

<?php

preg_match('![a-z]+([0-9]+)!' , 'abc123def' , $MatchedArr);
var_export($MatchedArr);
// array (
//   0 => 'abc123',
//   1 => '123',
// )

preg_match_all('!([a-z])([1-9])!' , 'a1b2c3' , $MatchedArr);
var_export($MatchedArr);
// array (
//   0 =>
//   array (
//     0 => 'a1',
//     1 => 'b2',
//     2 => 'c3',
//   ),
//   1 =>
//   array (
//     0 => 'a',
//     1 => 'b',
//     2 => 'c',
//   ),
//   2 =>
//   array (
//     0 => '1',
//     1 => '2',
//     2 => '3',
//   ),
// )


007 preg_replace関数

<?php

$wk_str = '1a2b3c';
echo preg_replace('![^0-9]!', '' , $wk_str); //123


008 ctype_digit関数

<?php

$wk_func = function($p){
    echo "ctype_digit({$p})の結果 ";
    var_dump(ctype_digit($p));
};

$wk_func('1a2b3c'); //ctype_digit(1a2b3c)の結果 bool(false)
$wk_func('123');    //ctype_digit(123)の結果 bool(true)


009 array_map関数で再帰呼び出し

<?php
$wk_arr = [0 => 10,
           1 => 20,
           2 => [30,40,50]];

var_export(prod10($wk_arr));
// array (
//   0 => 100,
//   1 => 200,
//   2 =>
//   array (
//     0 => 300,
//     1 => 400,
//     2 => 500,
//   ),
// )

function prod10($p)
{
    if(is_array($p)) return array_map(__FUNCTION__,$p);
    return $p *= 10;
}


010 複数変数のデバッグ表示用の配列定義

<?php
$BoolVar = false;
$IntVar  = 123;
$StrVar  = 'abc';

var_export(['$BoolVar' => $BoolVar,
            '$IntVar'  => $IntVar,
            '$StrVar'  => $StrVar]);
// array (
//   '$BoolVar' => false,
//   '$IntVar' => 123,
//   '$StrVar' => 'abc',
// )


011 独習PHPの読書メモその1 関数やクラスのスコープ

独習PHPの226ページ
PHPの関数やクラスは、常にグローバルスコープを持つ。
関数内の関数であっても、関数の外部から呼び出し可能である。


012 独習PHPの読書メモその2 $GLOBALSという連想配列

独習PHPの229ページ
$GLOBALSという全てのグローバル変数を管理する特殊な連想配列は、デバッグ時に使えそう

<?php
$wk_global = 1234;
var_dump($GLOBALS);


013 独習PHPの読書メモその3 use命令

独習PHPの246ページ
use命令は、C#のラムダ式の変数のキャプチャ機能のように使える。
use($wk_global)  だと値渡しで
use(&$wk_global) だと参照渡しとなる。

<?php
$wk_global = 'aaa';

$wk_func = function() use($wk_global)
{
    echo $wk_global; //aaa
};
$wk_func();


014 header関数でのLocationヘッダ出力のHTTPステータス

独習PHPの302ページ
header関数でのLocationヘッダを出力した場合、
デフォルトでHTTPステータス302を出力する。


015 独習PHPの読書メモその4 clone命令

独習PHPの468ページ
PHPでオブジェクト型のクローンを作成するには、
clone命令を使用する。

<?php
date_default_timezone_set('Asia/Tokyo');

$wk_date1 = new DateTime('2000-01-01');
$wk_date2 = $wk_date1;
$wk_date3 = clone $wk_date1;

$wk_date2->modify('+1 day');
$wk_date3->modify('+9 day');
echo $wk_date1->format('Y-m-d') . PHP_EOL; //2000-01-02
echo $wk_date2->format('Y-m-d') . PHP_EOL; //2000-01-02
echo $wk_date3->format('Y-m-d') . PHP_EOL; //2000-01-10


016 PHPでの配列型の代入は、ディープコピー

https://www.php.net/manual/ja/language.types.array.php#example-70
>配列への代入においては、常に値がコピーされることに注意してください。 
>配列をリファレンスでコピーする場合には、 リファレンス演算子を使う必要があります。 

<?php
$arrA = array();
$arrA[0] = array(777,888,999);

$arrB = $arrA;
$arrA[0] = array(111,222,333);

var_export($arrA);
// array (
//   0 =>
//   array (
//     0 => 111,
//     1 => 222,
//     2 => 333,
//   ),
// )

var_export($arrB);
// array (
//   0 =>
//   array (
//     0 => 777,
//     1 => 888,
//     2 => 999,
//   ),
// )


017 array_search関数

array_search関数は、配列の要素を検索し、
ヒットすれば、添字を返す。
ヒットしなければ、Falseを返す。

<?php
$wk_arr = ['ColA' => 'AAAA',
           'ColB' => 'BBBB'];

var_export(array_search('BBBB' , $wk_arr)); // 'ColB'
echo PHP_EOL;
var_export(array_search('NonExistsValue' , $wk_arr)); // false


018 array_keys関数とarray_values関数

配列の添字の配列を作るのが、array_keys関数
配列の値の配列を作るのが、array_values関数

<?php
$wk_arr = ['Ind111' => 'Val111',
           'Ind222' => 'Val222',
           'Ind333' => 'Val333'];
var_export(array_keys($wk_arr));
echo PHP_EOL;
var_export(array_values($wk_arr));

// array (
//   0 => 'Ind111',
//   1 => 'Ind222',
//   2 => 'Ind333',
// )
// array (
//   0 => 'Val111',
//   1 => 'Val222',
//   2 => 'Val333',
// )


019 number_format関数

number_format関数は、3桁ごとにカンマ区切りにする。
第2引数で、小数部の桁数を指定できる。

<?php
echo number_format(12345);      // 12,345
echo number_format(3.141592);   // 3
echo number_format(3.141592,2); // 3.14


020 開発時の500エラーの原因調査用

<?php

register_shutdown_function(
    function(){
        $e = error_get_last();
        if( $e['type'] == E_ERROR ||
            $e['type'] == E_PARSE ||
            $e['type'] == E_CORE_ERROR ||
            $e['type'] == E_COMPILE_ERROR ||
            $e['type'] == E_USER_ERROR ){
            var_export($e);
        }
    }
);

set_error_handler(function($ErrorNo, $ErrorStr, $ErrorFile, $ErrorLine){
    throw new ErrorException($ErrorNo, $ErrorStr, 0, $ErrorFile, $ErrorLine);
});

$ins = new NonExistsClass;


021 シリアライズとデシリアライズ

<?php

$wk_arr1 = ['AAAA','BBBB','CCCC'];

define(serial_file_path , __DIR__ . '/serialize_data.txt');

// 配列をシリアライズして保存する
file_put_contents(serial_file_path, serialize($wk_arr1));

// デシリアライズして配列に復元する
$wk_arr2 = unserialize(file_get_contents(serial_file_path));

var_export($wk_arr2);


022 条件演算子は短絡評価

<?php

$A = 0;
$B = 0;

true ? $A++ : $B++;
printf('$A=%d,$B=%d',$A,$B);
//$A=1,$B=0


023 DateTime型の当日取得の注意点

new DateTime() だと、時分秒も持つので注意
new DateTime(date('Y-m-d')) なら、時分秒は切り捨てられる。

<?php
date_default_timezone_set('Asia/Tokyo');

$Ins1 = new DateTime();
$Ins2 = new DateTime('2020-01-31');

echo $Ins1->format('Y-m-d H:i:s'); // 2020-01-31 12:34:56
echo PHP_EOL;
echo $Ins2->format('Y-m-d H:i:s'); // 2020-01-31 00:00:00


024 isset関数でネストした配列の添字チェック

isset関数は、ネストした配列でも使用できる。

<?php error_reporting(E_ALL);

$arr = array();

if(isset($arr['ind']['ind']) == false){
    echo 'Non Notice Error'; //Non Notice Error
}


025 goto文でif文の指定位置に移動

<?php

goto the_label;
if(true){
    echo 111;
} else {
the_label:
    echo 222;
}


026 for文で連番作成

<?php

for($I = 1 ; $I <= 999 ; $I++){
    printf('%03d' , $I);
    echo PHP_EOL;
}