トップページに戻る
Cマガ電脳クラブで勉強したこと
オートコンプリート
LINQに対応した配列の操作
正規表現メモ
サクラエディタの設定
PHPメモ
目次
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;
}