ソースコードで学ぶWebプログラミング

PHPでデータを変換する7つの方法

Webプログラムをライフサイクルで見た場合、処理内容を3つに分類できます。

Webプログラムのライフサイクル

・入力データの受取 ・データの変換 ・データの出力処理

これはWebサイトでの処理が「ブラウザからの入力」「出力するデータの作成」「データの出力」で構成されるためです。 このページではプログラミングで重要となる「データの変換」を習得できるように解説します。

プログラミングは、作りたいものに対して、要所での目標を定めてから、出来ることを組み合わせて、達成していく作業となります。

ここで「要所」とは、機能や処理内容で分離可能なコード上の範囲で、1行毎、関数毎と捉えられるものですが、 そこで定められた「目標」=期待する処理結果を少しずつ積み重ねて最終目標を達成することになります。

要所の捉え方は、経験により効率化されていくものなので、トレーニングが必要となります。 例えば、標準関数を使い慣れていない状態では、1行毎に目標達成を確認しながら開発を行うことになりますが、 慣れてくると関数やクラス、URL単位などでの目標達成を確認できるようになります。

目標を設定するには、プログラミングで「出来ること」を知っている必要があります。 また実際に「出来ること」をコーディングしていく作業は、処理の組み合わせ方を覚えていく作業と言えますが、 これもトレーニングが必要となります。

このページでは、PHPプログラミングで「出来ること」を知っておくためのページです。 すべて覚えてしまうのが理想ですが、実際にコーディングの中で、使い所とともに覚えないと 身につかないので、一覧と簡単な解説に留めます。

文字列を別の文字列に変換したい時

テキストを別のテキストに変換する処理です。保存や表示などの出力のための変換やエスケープ処理で使うことになります。

<?php /* 文字列の結合 */ $txt = $txt1 . $txt2; /* 追加 */ $txt .= $txt3; /* 文字列の一部切り出し */ $sub = mb_substr($txt, 0, 30); /* 対象文字を指定文字に置換 例:タブを除去 */ $txt = str_replace("\t","",$txt); /* 正規表現で置換 mで複数行扱い 例:末尾の改行タグを除去 */ $txt = preg_replace("/<br>$/m","",$txt); /* sで.が改行もヒット 例:pタグに挟まれた要素を除去 */ $txt = preg_replace("{<p>.+</p>}s","",$txt); /* アルファベットをすべて大文字に */ $txt = strtoupper($txt); /* アルファベットをすべて小文字に */ $txt = strtolower($txt); /* 全角英字を半角英字に */ $txt = mb_convert_kana($txt, 'r'); /* 全角数字を半角数字に */ $txt = mb_convert_kana($txt, 'n'); /* 全角英字、数字、スペースを半角に */ $txt = mb_convert_kana($txt, 'as'); /* 半角カタカナを全角カタカナに */ $txt = mb_convert_kana($txt, 'K'); /* 全角カタカナを全角ひらがなに */ $txt = mb_convert_kana($txt, 'c'); /* 末尾の空白、タブ、改行などを除去 */ $txt = rtrim($txt); /* エスケープ処理 対象:' " \ NUL */ $txt = addslashes($txt); /* エスケープを除去 */ $txt = stripslashes($txt); /* タグの無効化 ENT_QUOTES で ' も変換 */ $txt = htmlspecialchars($txt, ENT_QUOTES); /* タグを除去 例:改行タグは残す */ $txt = strip_tags($txt, '<br>');

文字列を別のフォーマットに変換したい時

テキストを別のかたちに変換する処理です。主に処理パターンに当てはめるために利用されます。

<?php /* 文字列を区切り文字で分けて配列に */ $array = explode("\t",$txt); /* 文字列を区切り文字で分けて変数に入れる */ list($a,$b,$c) = explode("\t",$txt); /* 該当箇所を抜き出して処理 */ if (preg_match("{<title>([^<]+)</title>}", $txt, $m)) { //$m[0] に適合した文字列全体 //$m[1] に()内の適合した文字列 } /* 該当箇所をすべて抜き出して処理 */ if (preg_match_all("{<h2>([^<]+)</h2>}", $txt, $a)) { //$a[0] に適合した文字列全体の配列 //$a[1] に()内の適合した文字列の配列 } /* 変数名から変数名と値の配列を作る */ $str = '文字列'; $a = compact('str');//array('str'=>'文字列'); /* 文字エンコーディングを変換 例:SJIS→UTF8 */ $txt = mb_convert_encoding($txt, 'UTF-8', 'SJIS-win'); /* XML文字列をオブジェクト化 */ $xml = simplexml_load_string($txt); /* クエリ文字列を連想配列に */ parse_str('key1=val2&key2=val2', $r);

文字列を比較などで判定したい時

文字列の状態で処理分けを行う処理です。バリデーションなどで利用されます。

<?php /* 文字列の比較 */ if ($txt=='') {} /* 文字列か否か */ if (is_string($txt)) {} /* 数値か否か */ if (is_numeric($txt)) {} /* 整数か否か */ if (is_int($txt)) {} /* NULLか否か */ if (is_null($txt)) {} /* 文字列が存在するか 存在した場合0以上の位置数値 falseで存在しない */ if (strpos($txt,'abc')!==false) {} /* 数字以外が存在 */ if (preg_match('/[^\d]/',$txt)) {} /* 英数字以外が存在 */ if (preg_match('/[^a-zA-Z0-9]/',$txt)) {} /* 文字列の類似性を%計算 */ similar_text('aaaaa', 'aaabb', $p);

数値データの扱い方

計算を行う処理です。集計などはDB側で行うケースが多いため、Webプログラミングでは余り使用しない印象です。

<?php /* 四則演算 変数に直接演算する場合、下コードも可 */ /* 足し算、加算 */ $n = 1 + 2; $n += 5; /* 引き算、減算 */ $n = 2 - 1; $n -= 5; /* 掛け算、乗算 */ $n = 2 * 3; $n *= 5; /* 割り算、除算 */ $n = 1 / 3; $n /= 5; /* 割った余り 剰余 */ $n = 5 % 2; $n %= 3; /* ++で1足す、--で1引く、後方で次行から、前方で現行から */ $n = 5; echo $n++;//5が表示される echo $n;//6が表示される echo ++$n;//7が表示される echo $n--;//7が表示される echo $n;//6が表示される echo --$n;//5が表示される /* 整数化する 切り捨て */ $n = intval(3.141592); /* 四捨五入する */ $n = round($n); /* 端数を切り捨て */ $n = floor($n); /* 端数を切り上げ */ $n = ceil($n); /* 絶対値を取り出す */ $n = abs($n); /* 最小を返す */ $n = min(5, 8); /* 最大を返す */ $n = max(5, 8); /* 1,000毎にカンマ入れ */ $txt = number_format($n); /* 小数点以下の桁を丸める 例:5桁 */ $txt = sprintf('%.05f', 1/6); /* 桁数を揃える 例:製品番号を0で埋めて5桁に */ $txt = sprintf('%05d', 5);

連想配列を別の連想配列に変換したい時

PHPでは、配列と連想配列の内容上の区別がありますが、処理対象とした場合の区別はありません。 配列は、キーが数値の連想配列として処理されます。

<?php /* 配列を順番に処理 */ foreach($a as $v){} /* 連想配列を順番に処理 */ foreach($a as $key=>$val){} /* 配列の結合 数値添字は0から再設定される */ $a = array_merge($a, $b); /* 配列から一部を抜き出し 数値添字以降 */ $a = array_slice($a, 2);//3番目から最後まで $a = array_slice($a, 2, 5);//範囲指定 /* 配列の一部を削除する */ array_splice($a, 2);//3番目から最後までを削除 array_splice($a, 2, 5);//範囲指定 /* 配列をキーで削除する */ unset($a['key']); /* 配列のキーリストを取り出す */ $keys = array_keys($a); /* 配列の値リストを取り出す */ $vals = array_values($a); /* 配列の値を検索、キーを返す */ $key = array_search($a,'value'); /* 配列からランダムにキーを取り出す */ $key = array_rand($a); /* 配列の要素の順番をランダムにする */ shuffle($a); /* 配列の最後に追加 */ array_push($a, '最後'); /* 1件の場合 こっちの方が軽量 */ $a[] = '最後'; array_push($a, array('1','2'));//複数追加 /* 配列の最初に追加 */ array_unshift($a, '最初'); array_unshift($a, array('1','2'));//複数追加 /* 配列の最後を取り除く */ $b = array_pop($a); /* 配列の最初を取り除く */ $b = array_shift($a); /* 配列の値を比較して$aにだけ存在するものを返す */ $c = array_diff($a, $b); /* 連想配列を比較して$aにだけ存在するものを返す */ $c = array_diff_assoc($a, $b); /* 配列の共通項を抜き出す */ $c = array_intersect($a, $b); /* 配列の要素数 */ $n = count($a); /* 配列の値を合計する */ $n = array_sum($a); /* 配列の要素に関数を通して一括処理する */ $b = array_map('func', $a); /* 配列の要素に関数フィルタを通して、適合したものを取り出す */ $b = array_filter('func', $a); /* 配列のキーを変数名、値を値の変数を作成 */ $a = array( 'year'=>'2018', 'month'=>'01' ); extract($a); echo $year .'/'. $month; /* 配列を小さい順に並び替え */ sort($a); /* 配列を大きい順に並び替え */ rsort($a); /* 連想配列をキーで小さい順に並び替え */ ksort($a); /* 連想配列をキーで大きい順に並び替え */ krsort($a); /* 連想配列を値で小さい順に並び替え */ asort($a); /* 連想配列を値で大きい順に並び替え */ arsort($a); /* 関数を通して配列を並び替え */ usort($a, 'func'); /* 関数を通して連想配列のキーで並び替え */ uksort($a, 'func'); /* 関数を通して連想配列の値で並び替え */ uasort($a, 'func');

連想配列を別のフォーマットに変換したい時

主に出力するための処理です。Ajaxでのレスポンスや変数のログが必要な時などに利用されます。

<?php /* 配列をJSONデータに */ $json = json_encode($a, JSON_UNESCAPED_UNICODE); /* JSONデータを配列に */ $a = json_decode($json, true); /* 配列を文字列に */ $seri = serialize($a); /* 文字列にした配列を元に戻す */ $a = unserialize($seri); /* 連想配列をURLエンコードされたクエリ文字列に */ $txt = http_build_query($a); /* 配列の中身を表示して確認する */ print_r($a); /* 配列の中身の確認用に文字列にする */ $txt = print_r($a, true); /* 配列を変数の型も含めて表示して確認する */ var_dump($a);

連想配列で判定したい時

連想配列の状態で処理分けを行う処理です。

/* 配列か否か */ if (is_array($a)) {} /* 配列が空か */ if (count($a)==0) {} /* キーが一致するか */ $c = array_diff(array_keys($a), array_keys($b)); if (count($c)==0) {} /* 連想配列が一致するか */ $c = array_diff_assoc($a, $b); if (count($c)==0) {} /* 配列にキーがあるか */ if (array_key_exists($a,'key') {} /* キーがあっても値がnullでfalse */ if (isset($a['key'])) {} /* 配列に値があるか */ if (in_array('key',$a)) {}