geek-logo.jpg

メモをとるのは面倒くさいし、検索するのも面倒くさい。散らかるブックマークも好きじゃない・・・そんな理由も何かにつながる

ディレクトリ・ツリー

ディレクトリの中身をずらっとツリー構造で取得したいときがあります。

例では、起点となるディレクトリのパスを引数に持つ、最低限の関数です。サイトマップの生成などにどうぞ。

 1. function dir_tree_recursion( $path ){
 2.   if( !is_dir($path)) return false;
 3.   $nodes = array();
 4.   if( $h = opendir($path)){
 5.     while(( $node = readdir($h)) !== false ){
 6.       if(( $node !== '.' ) && ( $node !== '..' )) continue;
 7.       if( is_dir( $path .'/'. $node )){
 8.         array_push( $nodes, dir_tree_recursion( $path .'/'. $node ));
 9.       }elseif( is_file( $path .'/'. $node )){
10.         array_push( $nodes, $path .'/'. $node ):
11.       }
12.     }
13.     closedir($h);
14.   }
15.   return $nodes;
16. }

2行目:
引数で渡されたパスがディレクトリであれば処理を続行します。

3行目:
戻り値となる配列を用意。

4〜14行:
パスのディレクトリ・ハンドルを開き、ディレクトリからノードを取得し、ノードに対する処理を行っていきます。

6行目:
ノードが自身と上位階層のディレクトリを指す場合は除外します。

7〜8行:
パスとノードを結合(※1)した対象がディレクトリである場合、再帰的に処理を続行した結果を戻り値に追加します。

9〜10行:
対象がファイルの場合、ノードを戻り値に追加します。

13行目:
ディレクトリ・ハンドルを閉じます。

15行目:
戻り値を返します。

PHPを覚えるなら

初めてのPHP5 増補改訂版

新品価格
¥3,045から
(2013/5/7 15:38時点)

もっと読む

相対的な経過時間

はじめまして・・・GW中に始めた「ぼくのgeekなひとりごと・・・」は、そのタイトルの通り自分の為にgeekなことをメモしちゃおうと思います。


最近Facebookなどで見かける「何分前」、「何時間前」、「何日前」のような相対的な時間表記。

PHPの日付および時刻に関する関数に相対的な書式はサポートされてますが、記事の投稿日時などを相対的に求めたい時にどうぞ。

 1. function relative_date($ts){
 2.   $now_ts = time();
 3.   $delta = $now_ts - $ts;
 4.   if( $delta <= 60 ){
 5.     echo '1分以内';
 6.   }else if( $delta <= 86400 ){
 7.     $hours = (int)( $delta / 3600 );
 8.     $min = (int)(( $delta % 3600 ) / 60 );
 9.     if( $hours && $min ){
10.       echo $hours .'時間'. $min .'分前';
11.     }else if($hours){
12.       echo $hours .'時間前';
13.     }else if($min){
14.       echo $min .'分前';
15.     }
16.   }else if( $delta <= 604800 ){
17.     $days = (int)( $delta / 86400 );
18.     $hours = (int)( $delta % 86400 ) / 3600 );
19.     if( $days && $hours ){
20.       echo $days .'日'. $hours .'時間前';
21.     }else if($days){
22.       echo $days .'日前';
23.     }else if($hours){
24.       echo $hours .'時間前';
25.     }
26.   }else{
27.     echo date( 'Y年n月j日 H時i分', $ts );
28.   }
29. }

1行目:
相対的な経過時間を求めたい日時のタイムスタンプを受け取る関数を用意します。

2〜3行:
現在のタイムスタンプを取得し、現在のタイムスタンプと経過時刻を求めたい日時のタイムスタンプの差分を求めます。

4〜5行:
3行目で求めた差分(以下、差分)の値が60以下の場合、60秒以下ということになるので、「1分以内」を出力します。

6〜15行:
差分が86400(=60秒×60分×24時間)以下の場合、その差分は1日以内になるので、
さらに差分を3600(=60秒×60分)で割り整数にキャストすることでN時間を求めます。
さらに差分を3600(=60秒×60分)で割った余りを60で割整数にキャストすることでN分を求めます。

9〜10行:
N時間、N分共に0ではない場合、「N時間N分前」を出力します。

11〜12行:
N分が0の場合、「N時間前」を出力します。

13〜14行:
N時間が0の場合、「N分前」を出力します。

16〜25行:
差分が604800(=86400(=60秒×60分×24時間)×7日)以下の場合、その差分は1週間以内になるので、
さらに差分を86400(=60秒×60分×24時間)で割り整数にキャストすることでN日を求めます。
さらに差分を86400(=60秒×60分×24時間)で割った余りを3600で割整数にキャストすることでN時間を求めます。

19〜20行:
N日、N時間共に0ではない場合、「N日N時間前」を出力します。

21〜22行:
N時間が0の場合、「N日前」を出力します。

23〜24行:
N日が0の場合、「N時間前」を出力します。

26〜27行:
上記にも当てはまらなかった場合、「N年N月N日 N時N分」を出力します。


文字列を出力する間数echoをreturnに変更することで求めた文字列を返す関数としても使えます。

PHPを覚えるなら

初めてのPHP5 増補改訂版

新品価格
¥3,045から
(2013/5/7 15:38時点)