Yasuのブログ

北海道の大学生Yasuが、ライティングスキルとIT知識を高めるためにブログを始めました。

PHPのお勉強。4

☆配列を切り出す

$配列 = array_slice($元の配列, 開始位置, 長さ);

 

☆配列を反転

$配列 = array_reverse($元の配列);

 

☆現在日時の取得

$変数 = time();

UNIXタイムスタンプ形式として表示される.

UNIXタイムスタンプ…西暦1970年1月1日からの秒数

 

$変数 = mktime(時間,分,秒,月,日,年);

→指定した日付をUNIXタイムスタンプ形式として表示する.

 

UNIXタイムスタンプを日付にする

$変数 = date(フォーマット, UNIXタイムスタンプ);

 

※現在日付を表示するプログラムを組んだ所、15時のはずが08時と表示された.

7時間のずれ、これはグリニッジ標準時では?と予想.

php.ini内にdefault_timezoneをTokyo/Asiaにセットするパターンと、プログラム内でTimezoneを設定してから元に戻すパターンの2つが選択できる.

後者でプログラムを改めて組むと成功.

 

// TimeZoneを日本時間に設定する

$org_timezone = date_default_timezone_get();

date_default_timezone_set('Asia/Tokyo');

 

 

// date関数を使う

$timestamp = time();

$next_week = date('Y年m月d日 H時i分s秒', $timestamp);

print $next_week;

 

// TimeZoneを元に戻す

date_default_timezone_set($org_timezone);

 

これで成功した.

参考にしたサイトはこちら.

http://amidagamine.com/notes/2011/11/07/php-date%E9%96%A2%E6%95%B0%E3%81%AE%E6%99%82%E9%96%93timezone%E3%81%8C%E3%81%9A%E3%82%8C%E3%82%8B/ 

(あみだがみねのもろもろ備忘録 様)

 

☆日付の妥当性をチェック

$変数 = checkdate(月, 日, 年);

 

☆ファイル操作

ファイル読込

$変数 = file_get_contents("ファイル名またはURL");

変数にファイル内容を文字列として格納する.

 

読込み可能か判断する関数 is_readable(ファイル名);

読込んだファイルの内容を1行毎に配列に取得したい時はfile関数を用いる.

 

ファイルにデータ書込

file_put_contents("ファイル名", $変数);

ファイルがない時は新しく生成され、ある時は上書きされる.

 

文字コード変換

$mb_convert_encoding($変数, "変換後の文字コード", "変換前の文字コード");

 

☆ファイルを開く、書き込む、閉じる

$ファイルポインタ = fopen("ファイル名orURL", "オプション"); //オプションにはr,w等を指定

fwrite($ファイルポインタ, "書き込みデータ");

fclose($ファイルポインタ);

 

☆ファイルを削除する

$変数 = unlink("ファイル名");

 

is_file関数…ファイルの存在を確認

&&でunlink関数と組み合わせる事で、削除した後の挙動をif文で分岐可能.

 

☆ファイルをコピーする

copy(コピー元ファイル名, コピー先ファイル名);

 

☆ディレクトリを作成する

$変数 = mkdir("パス名", モード);

phpファイルを置いてあるディレクトリに出来る.MAMPではhtdocsフォルダにファイルを置いてあるので、その階層にhtdocs/tempの形で置かれることになる.

 

☆ディレクトリを削除する

rmdir(ディレクトリ名);

 

☆パス情報の取得

$pathname = pathinfo(__FILE__);

print $pathname['dirname'] ."<br>";

print $pathname['basename'] ."<br>";

print $pathname['extension'] ."<br>";

 

☆HTTPヘッダ操作

HTTP HyperText Transfer Protocol HTTP

リクエスト:メソッド、ヘッダー、データで構成された文字列

リクエストメソッドでページを表示する要求、リクエストヘッダにブラウザの情報が含まれて送信される

 

レスポンスヘッダ

Webサーバの挙動

リクエストを受信→処理実行→ステータスコードをブラウザへ送信(3桁の数字)→レスポンスがブラウザへ送信(ヘッダ、データで構成されている)

レスポンスヘッダの一例:Content-Type //Perlではこれを出力しないとエラーになるが、PHPは自動的にやってくれる.

 

header("レスポンスヘッダ");

レスポンスヘッダの記述方法等、HTTPの詳細はこのページを確認(注:英語).

http://www.w3.org/Protocols/rfc2616/rfc2616

 

//data.csvがダウンロードされる

$downloadfile = "data.csv";

header("Content-Disposition: attachment; filename=$downloadfile");

header("Content-type: application/octet-stream; name=$downloadfile");

$result = fule_get_contents("test.data");

print $result;

 

☆リダイレクト

あるページから別のページに自動的に遷移すること.

header("Location: http://www.google.co.jp/");

exit;

// Googleにリダイレクトされる.URLはhttp://から始まる絶対パスで.

 

☆メール関係

PHP単体ではメール送信は出来ない.MTA(Message Transfer Agent)と呼ばれるメール配信のためのサーバソフトウェアを利用する.Linux系のOSをインストールすると標準で入っている.PHPは自動的にそのMTAへのパスが設定される.

WindowsとLinuxでメール送信に関しての仕組みが違う.

Windowsではphp.iniのSMTPSMTPホストのDNS名orIPアドレス、sendmail_fromには差出人のアドレスを設定.

 

メールを送信する

mb_send_mail(宛先, 件名, 本文, 追加のヘッダ);

マルチバイト文字列対応のこの関数を利用することで文字コードを殆ど意識せずに利用可能.

if文と組み合わせる

 

→やってみたけど、if文で分岐した条件で成功してはいるが、実際にメールは送信されていない.

プロバイダの設定をしっかりしてから送信するべきかもしれない.Retryすべき.

 

正規表現

正規表現は、フォーム等での入力データを、サーバーサイドで決めた数字、半角英字のパターンに照らし合わせて適合しているかを調べるのに使われる.

 

preg_match(正規表現パターン, 文字列);

if文と組み合わせて使う.

 

 

正規表現について詳しく書かれている本、ない?教えてエ○い人.

PHPのお勉強。3

☆文字列バイト数を得る

$変数 = strlen($引数);

UTF-8の場合、日本語1文字で3バイト.

 

☆文字列の分割

$変数 = substr(文字列, 文字列の位置, 文字列の長さ);

※勿論の事だが、文字列の位置は0から数える.

 

☆文字列の置換

$変数 = str_replace(置換対象文字, 置換文字, 文字列);

 

☆スペースの除去

$変数 = trim(文字列);

→なぜか出来ない.PHPマニュアル(http://php.net/manual/ja/function.trim.php)を参照すると、ASCIIでないと使えないのか?環境はUTF-8

エンコーディングに詳しいエ○い人助けて.

 

☆HTMLタグを無効にする

$変数 = htmlspecialchars(文字列, オプション);

オプションは、

ENT_COMPAT : 「"」のみ変換(デフォ)

ENT_QUOTES : 「"」,「'」どちらも変換

ENT_NOQUOTES : どちらも変換しない

 

変換できる文字は、&,",',<,>の5つ.

 

XSSに対する防衛策のひとつである.

 

☆HTMLタグを取り除く

$変数 = strip_tags(文字列, 許可するタグ);

 

☆改行コードの前に改行タグを付ける

$変数 = nl2br(文字列);

 

<?php

$string = "PHP

わかりやすすぎ

ワロタ";

 

$result = nl2br($string);

print $result;

print

?>

 

☆配列から文字列を作成

$変数 = implode(区切り文字, 配列);

implodeをjoinに変えても全く同じ結果を返す.

 

☆エラーになる文字をエスケープする

$変数 = addslashes(文字列);

¥" のように、エラーになる文字をエスケープしてエラーがでないようにしてくれる.

 

☆文字列から配列を作成

$変数 = explode(区切り文字, 文字列);

print_r($array) => 配列の構造を表示する.

 

配列から文字列 => implode

文字列から配列 => explode

となっている.覚える助けになるかもしれない.

 

Perlのように文字列を文字に区切って配列に格納する

<?php

$string = "hello";

$array = preg_split('//', $string , -1, PREG_SPLIT_NO_EMPTY);

print_r($array);

?>

 

☆配列の基礎

//array関数で作成

$配列 = array("文字列0", "文字列1", "文字列2");

 

//インデックス(番号)を指定して作成

$配列[0] = "文字列0";

$配列[1] = "文字列1";

$配列[2] = "文字列2";

 

//インデックスを省略して指定

$配列 = array(); //初期化

$配列 = "文字列0";

$配列 = "文字列1";

$配列[] = "文字列2";

 

//array関数にキーとデータを指定して連想配列を作成する

$配列 = array( "key0" => "文字列0", "key1" => "文字列1", "key2" => "文字列2");

 

//キーを指定して連想配列を作成する

$配列["key0"] = "文字列0";

$配列["key1"] = "文字列1";

$配列["key2"] = "文字列2";

 

//多次元配列

$配列[0] = array( "key0" => "文字列0", "key1" => "文字列1", "key2" => "文字列2");

$配列[1] = array( "key0" => "文字列0", "key1" => "文字列1", "key2" => "文字列2");

$配列[2] = array( "key0" => "文字列0", "key1" => "文字列1", "key2" => "文字列2");

 

☆配列のデータを全て変数に格納

$配列 = list($変数1, $変数2, $変数3);

 

☆配列内のデータ並べ替え

昇順ソート sort($配列);

降順ソート rsort($配列);

 

sort($配列, フラグ);

フラグは3種.

SORT_REGULAR 普通どおりにデータ比較

SORT_NUMERIC 数値としてデータ比較

SORT_STRING 文字列としてデータ比較

 

データとキーをソート

データ : asort,arsort

キー : ksort, krsort

 

☆エンコーディングの際の文字の昇順、降順の取り決め

「一般的に文字データをソート(文字コードの大小に従い昇順とか降順に並び換える事)をした際に、昇順でソートすると、英語の小文字(a-z),大文字(A-Z)、数字(0-9)の順序で並べられます。

一般的な感覚で言えば、数字,英大文字,英小文字という順番なのですが、コード体系上の関係で、順番が変な結果になります。」(引用元:http://blogs.yahoo.co.jp/kawajun_island/58976461.html

 

☆配列末尾にデータ追加

array_push($配列, "追加文字列");

array_push($配列, $追加変数);

 

☆配列末尾のデータ削除

$変数 = array_pop($配列);

変数に指定した配列の末尾データを代入.配列は取り出したデータ1つ分だけ短くなる.

 

☆配列先頭にデータ追加

array_unshift($配列, "追加文字列");

array_unshift($配列, "追加変数");

 

☆配列先頭のデータ削除

$変数 = array_shift($配列);

 インデックス番号は先頭に向かって1つずれる.

 

☆配列の結合

$配列 = array_merge($元の配列, $追加配列);

※結合する時同じキー(orインデックス)がある場合、array_merge関数では後から指定した配列の値で上書きされる.

 

 

PHPのお勉強。2

☆require文 //別ファイルに記述した処理を読み込む

 

require ("ファイル名");

require "ファイル名";

require $変数; //ファイル名を変数に格納して指定実行しても動作する

 

※require文と全く同じ機能のinclude文もある.ただし、include文はエラーの時Warningを出力して処理を実行するが、require文はFatal Errorとなり処理が停止する.

→エラーを吐かせないで処理を停止させたい場合は、require文がオススメ.

 

※require_once ()とinclude_once () 

1度読み込んだらその後はやってくれない.

 

☆ユーザ定義関数

function 関数名()

{

処理1;

処理2;

}

 

実行する時は

関数名();

 

※関数の中に関数記述もOK.再帰関数も可能という事になる。

 

試しに再帰関数をPHPで作ってみた

<?php

$start = 5;

 

function kaijo($start)

{

     if($start == 0){

          return 1;

     } else {

          return $start*kaijo($start-1);

     }

}

 

print kaijo($start);

?>

// 120

 

関数に引数を渡す手法,関数から値を受け取る手法は上を参照されたし.

return文は値を返す.

 

☆strlen('string'); 文字列の長さを返す

 

☆豆知識

○ダブルクォーテーション...変数が認識される

○シングルクォーテーション...変数が認識されない

 

グローバル変数

関数内で変数宣言したら、その変数はその関数内でしか使えない.

有効範囲(スコープ)をしっかり考える.

 

グローバル宣言を行うとずっと使える.

関数内で

global $data;

と入力すればよい.$dataはグローバル宣言する変数.

 

$globals['data']

というやり方もある.連想配列を用いたグローバル宣言.

 

スーパーグローバル

$globals, $_server, $_env, $_cookie, $_get, $_post, $_files, $_request, $_session

マニュアルを確認のこと.WordPressで既視感があるものも少なからずある.

 

static

 

復習:foreachを覚えているか.