関数・クラス解説
SQLite3::createAggregate
version:PHP 5 >= 5.3.0, PHP 7 (公式)SQL の集約関数として使用する PHP 関数を登録する
公式リファレンス
書式
public SQLite3::createAggregate ( string $name , mixed $step_callback , mixed $final_callback [, int $argument_count = -1 ] ) : bool
step ( mixed $context , int $rownumber , mixed $value , mixed ...$values ) : mixed
fini ( mixed $context , int $rownumber ) : mixed
説明
SQL の集約関数として使用する PHP 関数を登録します。 これは SQL 文の中で使用されるものです。
パラメータ
- name
- 作成あるいは再定義したい SQL 集約関数の名前。
- step_callback
- 結果セットの各行ごとにコールされるコールバック関数。 この関数で結果を集約し、集約処理のコンテキストに保存すべきです。 このコールバック関数は、以下のように定義すべきです:
- context
- 最初の行では NULL です。 2行目以降は、step 関数から返された値をとります。 これは、集約の状況を管理するのに使います。
- rownumber
- 現在の行番号
- value
- 集約に渡されるはじめの引数
- values
- 集約に渡されるふたつめ以降の引数
- final_callback
- 各行からの "段階的に処理された" データを集約するコールバック関数です。 いったん全データが処理されると、この関数が呼ばれます。 集約処理のコンテキストからデータを取り出し、結果を返すべきです。 このコールバック関数は SQLite が理解する型を返します。 (例: スカラー型) このコールバック関数は、以下のように定義すべきです:
- context
- 最後に呼ばれた step 関数から返された値を保持します。
- rownumber
- 常に 0.
- argument_count
- SQL 集約関数が受け取るパラメータの数。 負の値を指定すると、SQL 集約関数は任意の数の引数を受け取るようになります。
返値
集約関数の作成に成功した場合に TRUE、失敗した場合に FALSE を返します
サンプル
例1 max_length 集約関数の例
$data = array(
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten',
);
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE strings(a)");
$insert = $db->prepare('INSERT INTO strings VALUES (?)');
foreach ($data as $str) {
$insert->bindValue(1, $str);
$insert->execute();
}
$insert = null;
function max_len_step($context, $rownumber, $string)
{
if (strlen($string) > $context) {
$context = strlen($string);
}
return $context;
}
function max_len_finalize($context, $rownumber)
{
return $context === null ? 0 : $context;
}
$db->createAggregate('max_len', 'max_len_step', 'max_len_finalize');
var_dump($db->querySingle('SELECT max_len(a) from strings'));
上の例の出力は以下となります。
int(5)
この例では、テーブルのカラムに入っている一番長い文字列を集約する関数を作っています。 1行ごとに、max_len_step 関数が呼ばれ、 $context パラメータが渡されます。 context パラメータ は他のPHPの変数のように振る舞いますし、配列やオブジェクトを格納することさえできます。 この例では、単にこれまで見てきたものの中から一番大きな長さを保持するのに使っています。 つまり、$string が現在の最大値より大きな長さをもっていたら、 context を新しい最大値に更新しています。
全ての行を処理し終わったら、SQLite は 集約結果を決めるために max_len_finalize 関数を呼び出します。 ここでは、$context で見つかったデータを基にして、 ある種の計算を行うことができます。 私達のシンプルな例では、結果を段階的に計算してきているので、 単に context に入っている値を返すだけで済みます。
ヒント 値のコピーを context に保存し、一番最後に処理することは推奨できません。 なぜなら、SQLite がクエリを処理するのにたくさんのメモリを使うことになるからです。 - 100万行の情報がメモリに格納されていたとして、 それぞれの行が32バイトの長さを持っていたとすると、 どれくらいのメモリが必要になるのかを考えてみてください。
ヒント SQLite のネイティブなSQL関数を上書きするために SQLite3::createAggregate() を使うことができます。
ワード検索
※入力キーワードが、関数名・説明文・タグに含まれるものを検索関数名アルファベット別
最終更新一覧
●stristr
大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却
●stripslashes
バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く
●stripos
大文字小文字を区別せずに文字列が最初に現れる位置を取得する
●stripcslashes
addcslashes() でクォートされた文字列をアンクォートする
●strip_tags
文字列から HTML と PHP のタグを除去して返却
●strcspn
指定した文字が最初に現れる位置を調べる
●strcoll
ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する
●strcmp
2つの文字列を比較し同じか(あるいは大小)を判定する
●strchr
strstr() のエイリアス
●strcasecmp
2つの文字列を比較(大文字小文字を区別せず同じとみなす)
カテゴリー一覧
PHP の振る舞いの変更
音声フォーマットの操作
認証サービス
コマンドライン関連
圧縮およびアーカイブ
暗号
データベース関連
日付および時刻関連
ファイルシステム
自然言語および文字エンコーディング
画像処理および作成
メール関連
数学
テキスト以外の MIME 型
プロセス制御
その他の基本モジュール
その他のサービス
検索エンジン用の拡張モジュール
サーバー固有のモジュール
セッション関連
テキスト処理
変数・データ型関連
ウェブサービス
Windows 用のモジュール
XML 操作
GUI用の拡張モジュール