PHP・MySQL

配列の要素をカンマや記号等で区切りながら出力したい時のいくつかの方法

例えば以下のような7つの要素を持った配列がある。

$item_arr = array('A','B','C','D','E','F','G');

この配列の中身(要素)をすべて表示(出力)したい時

最も簡単なのは

PHP

foreach($item_arr as $item){
    echo $item;
}

出力結果

ABCDEFG

要素の羅列で構わなければこれで良いが、個々の区切りが分からないから、普通は出力時に「、」やカンマ、「/」のような記号を付けて書き出す。

PHP

foreach($item_arr as $item){
    echo $item;
    echo ('/');
}

出力結果

A/B/C/D/E/F/G/

個々の区切りは判別しやすくなったが、各要素の出力時に「/」を付加しているため、当然最後の要素(G)の後にも「/」が書き出されている。
このままではデータとして中途半端な感じが否めない。

最後の「/」を削除するにはいくつかの方法がある。

まずは、カンマ区切りのデータで最後のカンマを1つ削りたい時にも使う「rtrim」

例)

$str = rtrim($str, ",");

次に、最後の文字を削除する「substr」

$str = substr($str, 0, -1);

ただしこの場合、区切りに2バイトの文字や記号を使っていると文字化けする。

区切りに2バイト文字や2バイトの記号を使っている場合は、マルチバイトに対応した「mb_substr」を使う。
引数に文字コードを正しく指定することがポイント。

$str = mb_substr($str,0,1,"utf-8");

そして別の方法として、最初から無駄なカンマや記号を出力しない方法もある。

処理の流れ

$item_arr = array(‘A’,’B’,’C’,’D’,’E’,’F’,’G’);

配列の数をカウントする
$cnt = count($item_arr);

カウンターの初期化
$i = 0;

foreachで各処理を行う
foreach($item_arr as $item){

カウンターに1を加算
$i++;

要素を出力
echo $item;

カウンターが配列の個数と違う場合はカンマや「/」を付加
if($cnt !=$i){echo(‘ / ‘);}
}

出力結果

A/B/C/D/E/F/G

解説

配列の個数は常に「7」
Aの時 → カウンター「1」 → 「/」を付加
Bの時 → カウンター「2」 → 「/」を付加
Cの時 → カウンター「3」 → 「/」を付加
Dの時 → カウンター「4」 → 「/」を付加
Eの時 → カウンター「5」 → 「/」を付加
Fの時 → カウンター「6」 → 「/」を付加
Gの時 → カウンター「7」

Gの時、配列の個数「7」とカウンターの数値が一致するから「/」は付加されない。

実際のスクリプト

$item_arr = array('A','B','C','D','E','F','G');
$cnt = count($item_arr);
$i = 0;
foreach($item_arr as $item){
    $i++;
    echo $item;
    if($cnt !=$i){echo(' / ');}
}

サクッと全部に付加して最後に削るか、ちょっと手間をかけて無駄な付加をしないようにするか、目的や状況に合わせて使い分けるといい。

javascriptDBで出力されるタグを変更したい時はこの方法

JavaScriptのみでデータをMySQLのように使えるjavascriptDBの使い方(その1)で、javascriptDBの簡単な設定方法は説明したが、ページ内に埋め込むことを考え、スタイルシートが使えるように出力されるテーブルにidやclassを設定したり、タグを設定するための方法を説明する。

設定方法

jqueryおよびダウンロードしたdb_core.jsを読み込む

JAVASCRIPT

<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="db_core.js"></script>

同様にheader内でjavascriptDBの設定
(別ファイルにしても構わない)

JAVASCRIPT

<script>
var DBTest = new Database ("DBTest");
DBTest.CreateTable("members",Array("id","login","passwd","tel"));

DBTest.Insert("members",Array(1,"rosibel","clau","934856890"));
DBTest.Insert("members",Array(2,"joan","palafrugell","934856890"));

var selectArr1 = DBTest.Select('select * from members');
var selectArr2 = DBTest.Select('select passwd from members where login="joan"');

var selected1 = mView(selectArr1);
var selected2 = mView(selectArr2);

$(document).ready(function(){
	$("#output1").html(selected1);
	$("#output2").html(selected2);
});

function mView (o){
	var res = "<table>";
	for(i = 0; i < o.length; i++){
		res += "<tr>";
		for(j = 0; j < o[i].length; j++){res += "<td>"+o[i][j]+"</td>";}
		res += "</tr>";
	}
	res += "</table>";
	return res;
}
</script>

ボディ内の書き出したい場所にid=”output1″、id=”output2″を設置

HTML

<body>

<h2>select * from members</h2>
<div id="output1"></div>

<h2>select passwd from members where login="joan"</h2>
<div id="output2"></div>

</body>

サンプルページ

上記サンプルにアクセスすると以下のデータが出力される

<h2>select * from members</h2>

<div id="output1">
	<table>
		<tbody>
		<tr>
			<td>1</td>
			<td>rosibel</td>
			<td>clau</td>
			<td>934856890</td>
		</tr>
		<tr>
			<td>2</td>
			<td>joan</td>
			<td>palafrugell</td>
			<td>934856890</td>
		</tr>
		</tbody>
	</table>
</div>

<h2>select passwd from members where login="joan"</h2>

<div id="output2">
	<table>
		<tbody>
		<tr>
			<td>palafrugell</td>
		</tr>
		</tbody>
	</table>
</div>

解説

1. データベースをセット

var DBTest = new Database ("DBTest");

2. テーブル名とカラム名をセット

DBTest.CreateTable(“members”,Array(“id”,”login”,”passwd”,”tel”));

3. データを挿入

DBTest.Insert("members",Array(1,"rosibel","clau","934856890"));
DBTest.Insert("members",Array(2,"joan","palafrugell","934856890"));

4-1. セレクト文にて全データを出力(mySQLと同様)

var selectArr1 = DBTest.Select('select * from members');

4-2. MySQLと同様にwhereを使って条件抽出も可能

var selectArr2 = DBTest.Select('select passwd from members where login="joan"');

5. 各抽出データをテーブルに成形 ※1

var selected1 = mView(selectArr1);
var selected2 = mView(selectArr2);

6. 各データをjqueryを使って書き出し

$(document).ready(function(){
	$("#output1").html(selected1);
	$("#output2").html(selected2);
});

※1 javascriptDBの結果をテーブルに成形するfunction

function mView (o){
	var res = "<table id='my-tbl'>";
	for(i = 0; i < o.length; i++){
		res += "<tr>";
		for(j = 0; j < o[i].length; j++){res += "<td>"+o[i][j]+"</td>";}
		res += "</tr>";
	}
	res += "</table>";
	return res;
}

※1で javascriptDBの結果をテーブルタグで書き出すように設定しているが、サンプルのように<table>にidを設定(<table id=’my-tbl’>)したり、必要に応じて<hd>の代わりに<th>を使ったり<td class=’col-ab’>のようにすることができる。
あとは書き出したタグに対応したスタイルシートを設定すればいい。

CSS

<style>
h2 {
	margin-bottom:1px;
	font-weight:normal;
	font-size:1em;
}
table {
	border-collapse: collapse;
}
table td {
	padding:2px 8px;
	text-align:center;
	border:1px solid #ccc;
}
</style>

JavaScriptのみでデータがMySQLのように使えるjavascriptDBの使い方

データベース不要、PHP等が使えなくてもHTMLとJavaScriptだけでMySQLのようなselect文が使えるのはもちろん、whereでの条件設定も使えるという便利なjavascriptDBはお手軽なデータベース構築におススメ。

db_core.jsのダウンロードは以下のURLから

http://jsdb.sourceforge.net/usarho.html

設定方法

jqueryおよびダウンロードしたdb_core.jsを読み込む

<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="db_core.js"></script>

使い方

body内でjavascriptDBを設定

JAVASCRIPT

<script>
var DBTest = new Database ("DBTest");
DBTest.CreateTable("members",Array("id","login","passwd","tel"));
DBTest.Insert("members",Array(1,"rosibel","clau","934856890"));
DBTest.Insert("members",Array(2,"joan","palafrugell","934856890"));
var selectArr2 = DBTest.Select('select passwd from members where login="joan"');
DBTest.View(selectArr2,document);
</script>

サンプルページ

上記のコードをブラウザで見るとただの文字だが、body内に以下のデータが書き出されている

<table>
<tbody>
<tr>
<td>palafrugell </td>
</tr>
</tbody>
</table>

上記サンプルの場合、1単語1件のみのデータだが、内容に関係無くテーブル形式のデータとして出力される

解説

1. データベースをセット

var DBTest = new Database ("DBTest");

2. テーブル名とカラム名をセット

DBTest.CreateTable("members",Array("id","login","passwd","tel"));

3. データを挿入

DBTest.Insert("members",Array(1,"rosibel","clau","934856890"));
DBTest.Insert("members",Array(2,"joan","palafrugell","934856890"));

4. MySQLと同様にwhereを使って条件抽出も可能

var selectArr2 = DBTest.Select('select passwd from members where login="joan"');

5. 書き出し

DBTest.View(selectArr2,document);

単独で扱うにはこのままでも良いが、ページ内に埋め込むことを考えると出力されるテーブルにidやclassを設定したりテーブル以外のタグで書き出したい時もあるだろう。
javascriptDBの出力データの成形およびタグの設定については次の記事で掲載する。

javascriptDBで出力されるタグを変更したい時はこの方法

phpThumbの画像が突然表示されなくなったら

phpThumbはとても便利なライブラリなので、通常のウェブサイトの他、WordPressやMovable Typeと組み合わせて使っている人もいるだろう。
いままで問題無く表示されていたphpThumbを使ったサムネイルの画像が表示されなくなる原因のひとつがサーバーのPHPがバージョンアップ。
phpThumbはバージョンによってPHP5.3の環境ではエラーを返すようになる。
簡単な見分け方は簡単。
表示されない画像にALTが設定してあれば、画像の代わりにALTの文字が表示されているはず。右クリックで画像のみを表示させると、画像の代わりに下記のようなエラーコードが表示される。

Deprecated: Function eregi() is deprecated in /phpThumb_x.x.x/phpthumb.functions.php on line …

PHP 5.3では非推奨のeregi()が使われていることに対する警告

対応方法だが、選択肢は2種類。

1.  警告 メッセージのみ消す

スクリプト先頭の
error_reporting(E_ALL);
ini_set(‘display_errors’, ‘1’);
を変更。

簡単だが、これはおススメしない。
2の方法を施すまでの臨時対応にとどめたい。

2. phpThumb-for-PHP-5.3にする

以下のURLからphpThumb-for-PHP-5.3をダウンロードして置き換える

https://github.com/simpson/phpThumb-for-PHP-5.3

ページ右側にある「Download Zip」ボタンから一式をダウンロード

MySQLでデータを間引く簡単な方法

データ自体はかなり細かく保存されているが、欲しいのは大まかなデータで良い時、
select文で条件をいろいろつけて取り出すのもひとつの方法だが、まずは一気に取得してしまってから、出力する前に間引くというのもひとつの方法。

例えば、カラムにタイムスタンプがあれば、以下の方法で、同一分は一度だけ出力することができる。

$output = "";
while($col = $rst->fetchRow(MDB2_FETCHMODE_ASSOC)){
$update_jf = date("Hi", $col['time']);
if($update_jf != $sumi_jf){
$output .= $col['main'];
}
#出力済時分にセット
$sumi_jf = $update_jf;
}

さらに簡単にしたいなら、以下の方法(2分の1に間引き)

$output = "";
while($col = $rst->fetchRow(MDB2_FETCHMODE_ASSOC)){
if($n % 2 == 0){
$output .= $col['main'];
}
$n++;
}

3分の1に間引きたければ以下の方法

$output = "";
while($col = $rst->fetchRow(MDB2_FETCHMODE_ASSOC)){
if($n % 3 == 0){
$output .= $col['main'];
}
$n++;
}