$d='2012/2/29';
echo "変換前:".$d."<br>";
$d2=date('Y-m-d',strtotime($d));
echo "変換後:".$d2."<br>";
$d='2012/2/29 12:13:14';
echo "変換前:".$d."<br>";
$d2=date('h:i:s',strtotime($d));
echo "変換後:".$d2."<br>";
$d='xxxx'; echo '$d='.$d."<br>"; $x=strtotime($d); echo $x;
$date1 = "2016-6-15";
$date2 = beginWeekDate($date1);
echo "指定日:".$date1.'<br>';
echo "週始め:".$date2.'<br>';
/**
* 週始めの日付を取得
*
* 指定日付の週の週始めを取得する。
* 週始めは日曜日である。ただし月曜日フラグをONにした場合、月曜日が週始めとなる。
*
* @param date or string $date1 指定日付
* @param bool $monday_flg 月曜日フラグ 省略可 true:月曜日が週始めとなる。
* @param string $format 日付フォーマット【省略可】
*/
function beginWeekDate($date1,$monday_flg=0,$format='Y-m-d') {
$w = date("w",strtotime($date1));
if($w==0){
if(!empty($monday_flg)){
$bwDate = date($format, strtotime("-6 day", strtotime($date1)));
}else{
$bwDate = date($format, strtotime($date1));
}
}else{
if(!empty($monday_flg)){
$w--;
}
$bwDate = date($format, strtotime("-{$w} day", strtotime($date1)));
}
return $bwDate;
}
指定日:2016-6-15 週始め:2016-06-12
/**
* 引数日付から月初めの日付を取得する。
* @param $ymd
*/
private function getBeginningMonthDate($ymd) {
$ym = date("Y-m",strtotime($ymd));
$d=$ym.'-01';
return $d;
}
/**
* 引数日付から元旦日を取得する。
* @param $ymd
*/
private function getBeginningYearDate($ymd) {
$y = date("Y",strtotime($ymd));
$d=$y.'-01-01';
return $d;
}
$date = new DateTime("2006-12-12");
echo $date->format("Y-m-d");
本日の場合
$today = new DateTime();
echo $today->format("Y-m-d");
$date = new DateTime("2006-12-12");
echo $date->format("Y-m-d");
$date->modify("+3 day");
echo $date->format("Y-m-d");
$date = new DateTime();
$date->modify("-1 month");
echo $date->format("Y-m-d");
// 誤り
if('2022-11-3' > '2022-11-10'){
echo "2022-11-3が2022-11-10よりも大きい(最新)ということになってしまうので誤り<br><br>";
}
// 正しい比較
if(strtotime('2022-11-3') > strtotime('2022-11-10')){
}else{
echo "'2022-11-10'が大きい(最新)<br><br>";
}
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%d days');
$strYmd="2010年10月10日";
$d=DateTime::createFromFormat('Y年m月d日',$strYmd);
$d=$d->format('Y-m-d');
$start = new DateTime('2012/2/25');
$end = new DateTime('2012/3/5');
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($start,$interval,$end);
foreach($period as $d){
$x= $d->format('Y-m-d');//日付
}
$start = '2012/2/25';
$end = '2012/3/5';
for($d=$start;$d<=$end;$d++){
echo $d;//■■■□□□■■■□□□■■■□□□
}
参考サイト
$d1 = new DateTime("2006-12-12");
echo $d1->format("Y-m-d H:i:s");
echo "<br>";
$u=$d1->format("U");//☆unix timestampを取得
echo $u;
echo "<br>";
$u+=86400;//86400秒を加算して翌日にする。
echo $u;
echo "<br>";
$d2=new DateTime();
$d2->setTimestamp($u);//☆unix timestampから日付に再変換。
echo $d2->format("Y-m-d H:i:s");
$d1 = new DateTime("2011-12-30 00:00:00");
$d2 = new DateTime("2012-3-1 00:00:00");
echo $d1->format("Y-m-d")."<br>";
echo $d2->format("Y-m-d")."<br>";
//それぞれのUNIXタイムスタンプを取得
$u1=$d1->format("U");
$u2=$d2->format("U");
echo $u1."<br>";
echo $u2."<br>";
//一日の秒数
$a=86400;
echo "☆日付ループ( 'U = Y-m-d H:i:s')<br>";
//☆日付ループ
for($u=$u1;$u<=$u2;$u+=$a){
//setTimestampが使えない場合の代替コード。Datetime::setTimestamp(UNIXタイムスタンプ);
$y = date("Y", $u);
$m = date("m", $u);
$d = date("d", $u);
$h = date("H", $u);
$i = date("i", $u);
$s = date("s", $u);
echo "{$y}-{$m}-{$d} {$h}:{$i}:{$s}<br>";
}
echo "終了<br>";
//開始日付と終了日付をセット
$d1 = new DateTime("2011-12-30");
$d2 = new DateTime("2012-3-1");
//それぞれのUNIXタイムスタンプを取得
$u1=$d1->format("U");
$u2=$d2->format("U");
//間隔秒数に一日の秒数
$a=86400;
$d=new DateTime();
//☆日付ループ
for($u=$u1;$u<=$u2;$u+=$a){
$d->setTimestamp($u);//UNIXタイムスタンプから日付に変換。PHP5.2では未対応?
echo $d->format("Y-m-d");
echo "<br>\n";
}
JSONエンコード
$data=array(1=>'ペルシャ',2=>'ボンベイ',3=>'三毛',4=>'シャム',5=>'雉トラ',6=>'スフィンクス');//サンプルデータ
$json_str=json_encode($data,true);//JSONエンコード
JSONデコード
$json_str = '{"id":"11","animal_name":"test"}';
$data=json_decode($json_str,true);//JSONデコード
if($data===null){
error_log("JSONの展開に失敗しました。 " . json_last_error_msg() . ' ' . $json_str);
}
jsonファイルをJSONデコードする場合
$json_str = file_get_contents('test.json'); // test.jsonはutf8でWindosで保存されているファイル。(BOMが付いている)
// BOMを除去する
$json_str = deleteBom($json_str);
// JSONデコード
$data=json_decode($json_str,true);
// JSONデコードに失敗した場合
if ($error = json_last_error_msg()) {
$err_msg =
error_log("JSONの展開に失敗しました。→".$json_str);
}
/**
* UTF8ファイルのテキストに付いているBOMを除去する
* @param string $str UTF8ファイルから取得したテキストの文字列
* @return string BOMを除去した文字列
*/
function deleteBom($str){
if (($str == NULL) || (mb_strlen($str) == 0)) {
return $str;
}
if (ord($str{0}) == 0xef && ord($str{1}) == 0xbb && ord($str{2}) == 0xbf) {
$str = substr($str, 3);
}
return $str;
}
BOMに注意
$json_str = '{"id":"11","enquete_name":"test"}';
$json_str = '{"id":"11","enquete_name":"test"}';
oedit.exeにコピペするとBOMが「?」に文字化けしている。
JSONに次の記号、「<」、「>」、「"」、「'」、「&」、「/」、「¥」が含まれるときのJSONエンコード
下記のようにオプション指定する。$json = json_encode($data,JSON_HEX_TAG | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_HEX_APOS);
$data = array(1=>'<',2=>'>',3=>'"',4=>"'",5=>'&',6=>'/',7=>"\\");
var_dump($data);
array (size=7) 1 => string '<' (length=1) 2 => string '>' (length=1) 3 => string '"' (length=1) 4 => string ''' (length=1) 5 => string '&' (length=1) 6 => string '/' (length=1) 7 => string '\' (length=1)
$json = json_encode($data,JSON_HEX_TAG | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_HEX_APOS);
var_dump($json);
string '{"1":"\u003C","2":"\u003E","3":"\u0022","4":"\u0027","5":"\u0026","6":"\/","7":"\\"}' (length=84)
<input type="text" value='<?php echo $json?>' style="width:100%" />
$json4 = $('#json4').val();
var data = JSON.parse($json4);
console.log(data);
Object {1: "<", 2: ">", 3: """, 4: "'", 5: "&", 6: "/", 7: "¥"}
json_encodeの第2引数にtrue
json_encodeの第2引数にtrueを指定した場合、「<>」記号を含むデータも、JavaScriptでJSONパースすることができる。
<?php
$data2 = array('cat'=>'大猫','dog'=>'big_doc<input />','iguana'=>"big¥niguana");
$json2 = json_encode($data2,true);
echo "<div id='json2'>{$json2}</div>";
?>
JavaScript
var json1 = $('#json2').html();
var data1 = JSON.parse(json2);
検証
JavaScriptのパースについて
var data=$.parseJSON(json_str);//JSONパース(jQuery版) var data = JSON.parse(json_str);//JSONパース(JSONデコード) var json_str = JSON.stringify(data);//JSONエンコード
DBにjson文字列を保存するときの注意点
json文字列をDB保存する場合、addslashesでサニタイズしてからDB保存をすること。 そうしないと別の処理でDBからjson文字列を読み出し、そのjson文字列をパース(デコード)する際、失敗することがある。 json文字列中の値に「/」が入っているとエラーが起こるようだ。 「/」はURL文字列などでよく使われるので注意せねばならない。$json_str = json_encode($data, JSON_HEX_TAG | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_HEX_APOS); $json_str = addslashes($json_str); // SQLインジェクション対策のサニタイズ。これをやらないと「/」を含む文字列をデコードできなくなる。 // ⇒ 略 $json_strをDBに保存 // ~ 略 ~ // ⇒ 略 $json_strをDBから取得 $data = json_decode($json_str, true);//JSONデコード
JSONデコードに失敗する
JSONデコード(パース)に失敗する原因の一つに、JSON文字列に「"」が混じっているというのがある。 この場合、単純に置換してやればよい。
$data = json_decode(str_replace('"','"',$json_str), true);
JSONデコードのエラーの原因を調べる
「json_last_error_msg()」関数で最後に実行したJSONデコード失敗のエラーメッセージを出力できる。var_dump(json_last_error_msg());
$fn="test.txt";
$str=load($fn);
echo $str;
/**
* テキストファイル内の文字列を取得
*
* @param $txtFn テキストファイル名
* @return テキストファイル内の文字列(改行は\n)
*/
function load($fn) {
// 引数のiniファイル名が空、もしくは存在しなければ、なら、nullを返して終了
if (! $fn) {
return null;
}
$str = null;
$fn=mb_convert_encoding($fn,'SJIS','UTF-8');
if (!is_file($fn)){
return null;
}
if ($fp = fopen ( $fn, "r" )) {
$data = array ();
while ( false !== ($line = fgets ( $fp )) ) {
$str .= mb_convert_encoding ( $line, 'utf-8', 'utf-8,sjis,euc_jp,jis' );
}
}
fclose ( $fp );
return $str;
}
出力
2014-07-22 11:20:58 いろはにほへとちりぬのを わかよたれそつねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす
ソースコード
/**
* 文字列テキストファイルに書き出す
*
* @param $txtFn テキストファイル名
* @param $str 文字列
*/
function writeTextFile($txtFn, $str) {
// ファイルを追記モードで開く
$fp = fopen ( $txtFn, 'ab' );
// ファイルを排他ロックする
flock ( $fp, LOCK_EX );
// ファイルの中身を空にする
ftruncate ( $fp, 0 );
// データをファイルに書き込む
fwrite ( $fp, $str );
// ファイルを閉じる
fclose ( $fp );
}
ソースコード
// 対象ファイルのフルパスを作成
define('DS', DIRECTORY_SEPARATOR);
$fp = dirname(__FILE__).DS.'sample'.DS.'NekoController.php';
// 対象ファイルのソースコードを取得する
$text = load($fp);
echo $text;
function load($fn) {
// 引数のiniファイル名が空、もしくは存在しなければ、なら、nullを返して終了
if (! $fn) {
return null;
}
$str = null;
$fn=mb_convert_encoding($fn,'SJIS','UTF-8');
if (!is_file($fn)){
return null;
}
if ($fp = fopen ( $fn, "r" )) {
$data = array ();
while ( false !== ($line = fgets ( $fp )) ) {
$str .= mb_convert_encoding ( $line, 'utf-8', 'utf-8,sjis,euc_jp,jis' );
}
}
fclose ( $fp );
return $str;
}
$fn="test.txt";
$d=date("Y-m-d H:i:s");
$str=$d."\nいろはにほへとちりぬのを\nわかよたれそつねならむ\nうゐのおくやま けふこえて\nあさきゆめみし ゑひもせす\n";
save($fn,$str);//★
/**
* テキストファイルに書き出して保存
*
* @param $txtFn テキストファイル名
* @param $str 文字列
* @return なし
*/
function save($txtFn, $str) {
// ファイルを追記モードで開く
$fp = fopen ( $txtFn, 'ab' );
// ファイルを排他ロックする
flock ( $fp, LOCK_EX );
// ファイルの中身を空にする
ftruncate ( $fp, 0 );
// データをファイルに書き込む
fwrite ( $fp, $str );
// ファイルを閉じる
fclose ( $fp );
}
$ary=explode(",","猫,犬,たぬき");
splitについての公式サイト
| 空値の種類 | empty | isset | is_null | == "" | == null | == false | == 0 | === "" | === null | === false | === 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| "" | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
| null | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |
| 0.0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 |
| array() | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
| 未宣言 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
$ary=array_unique($ary);
| sort | 昇順ソート | キーは無視(再度、0,1,2...のように割り振られる) |
| srsort | 降順ソート | キーは無視 |
| sasort | 昇順ソート | キーも維持する。 |
| sarsort | 降順ソート | キーも維持する。 |
sort($ary);他にもソート関連の関数は存在する。
$data=array( array( 'id'=>3, 'name'=>'オオヒラタクワガタ', 'kind'=>'クワガタ', 'date'=>'2012/12/12', ), array( 'id'=>2, 'name'=>'リュウキュウカブト', 'kind'=>'カブト', 'date'=>'2012/12/15', ), array( 'id'=>1, 'name'=>'タイワンカブト', 'kind'=>'カブト', 'date'=>'2012/12/2', ), array( 'id'=>5, 'name'=>'ノコギリクワガタ', 'kind'=>'クワガタ', 'date'=>'2012/12/3', ), array( 'id'=>6, 'name'=>'アカアシクワガタ', 'kind'=>'クワガタ', 'date'=>'2012/12/22', ), );ソート前のデータ
| id | name | kind | date |
|---|---|---|---|
| 3 | オオヒラタクワガタ | クワガタ | 2012/12/12 |
| 2 | リュウキュウカブト | カブト | 2012/12/15 |
| 1 | タイワンカブト | カブト | 2012/12/2 |
| 5 | ノコギリクワガタ | クワガタ | 2012/12/3 |
| 6 | アカアシクワガタ | クワガタ | 2012/12/22 |
//IDで昇順ソート
$ids=array();
foreach($data as $key=> $ent){
$ids[$key]=$ent['id'];
}
array_multisort($ids,SORT_ASC,$data);
| id | name | kind | date |
|---|---|---|---|
| 1 | タイワンカブト | カブト | 2012/12/2 |
| 2 | リュウキュウカブト | カブト | 2012/12/15 |
| 3 | オオヒラタクワガタ | クワガタ | 2012/12/12 |
| 5 | ノコギリクワガタ | クワガタ | 2012/12/3 |
| 6 | アカアシクワガタ | クワガタ | 2012/12/22 |
//kindで降順ソート且つ、nameで昇順ソート
$kinds=array();
$dates=array();
foreach($data as $key=> $ent){
$kinds[$key]=$ent['kind'];
$names[$key]=$ent['name'];
}
array_multisort($kinds,SORT_DESC,$names,SORT_ASC,$data);
| id | name | kind | date |
|---|---|---|---|
| 6 | アカアシクワガタ | クワガタ | 2012/12/22 |
| 3 | オオヒラタクワガタ | クワガタ | 2012/12/12 |
| 5 | ノコギリクワガタ | クワガタ | 2012/12/3 |
| 1 | タイワンカブト | カブト | 2012/12/2 |
| 2 | リュウキュウカブト | カブト | 2012/12/15 |
$data = [
['id'=>0,'animal_name'=>'ネコ'],
['id'=>1,'animal_name'=>'ヤギ'],
['id'=>2,'animal_name'=>'カニ'],
['id'=>3,'animal_name'=>'サメ'],
];
$data = sortData($data,'animal_name',0);
var_dump($data);
/**
* 特定のフィールドでデータを並べ替える
* @param array $data データ(2次元配列)
* @param strong $sortField 並べ替えフィールド名
* @param int $orderFlg 0:昇順 , 1:降順
*/
function sortData($data,$sortField,$orderFlg){
$sfList=array();// ソートフィールドリスト
foreach($data as $key=> $ent){
$sfList[$key]=$ent[$sortField];
}
$sortFlg = SORT_ASC;
if(!empty($orderFlg)){
$sortFlg = SORT_DESC;
}
array_multisort($sfList,$sortFlg,$data);
return $data;
}
array (size=4)
0 =>
array (size=2)
'id' => int 2
'animal_name' => string 'カニ' (length=6)
1 =>
array (size=2)
'id' => int 3
'animal_name' => string 'サメ' (length=6)
2 =>
array (size=2)
'id' => int 0
'animal_name' => string 'ネコ' (length=6)
3 =>
array (size=2)
'id' => int 1
'animal_name' => string 'ヤギ' (length=6)
| 関数 | 説明 | 例 |
|---|---|---|
| array_merge() | キーが文字列であるなら上書きするが、キーが数値であるなら追加になる。 | $ary1=array_merge($ary1,$ary2); // ※$ary1に$ary2を上書き |
| array_merge_recursive() | 上書きでなく追加である。同じキーの値は配列にしてしまう。 | |
| Hash::merge() | キーが文字列、数値にかかわらず完全な上書き。 Cakeの環境があるなら「Hash::merge」が一番良い。完全な上書きであるため。 |
$ary1=Hash::merge($ary1,$ary2); |
$d='2012/2/29';
//日付フォーマット変換
$d2=date('Y-m-d',strtotime($d));
//出力→ 2012-02-29
サンプル
//変換前 $str="いろはにほへとちりぬのを\nわかよたれそつねならむ\rうゐのおくやま けふこえて\n\rあさきゆめみしゑひもせす"; //変換後 $str2=nl2br($str);サンプル
$t='4:20:00';
//日付フォーマット変換
$t2=date('H:i',strtotime($t));
echo $t2;
//出力→ 04:20
$v=reset($ary);
$v=end($ary)
| 関数名 | 説明 | 使用例 | ドキュメント |
|---|---|---|---|
| round | 四捨五入する。オプションで桁指定もできる。 | $a=round(3.14); //$a=3 |
ドキュメント |
| ceil | 小数点切り上げ | $a=ceil(3.14); //$a=4 |
ドキュメント |
| floor | 小数点切り捨て | $a=floor(3.14); //$a=3 |
ドキュメント |