$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 |
ドキュメント |