PHPでは、MySQLデータベースを使用する場合、 MySQLI_RESULT :: FETCH_COLUMN関数は、クエリ結果のデータの列を簡単に取得できます。 PHPのイテレーターパターンと組み合わせることで、大きなデータセットを効果的に通過し、メモリ使用量を最適化できます。この記事では、mysqli_result :: fetch_columnおよびiteratorパターンを使用して、効率的なデータトラバーサルを達成する方法について説明します。
イテレーターパターンは、コレクションの基礎となる表現を公開せずに、一貫した方法でコレクションを反復することができるデザインパターンです。 PHPのIteratorインターフェイスは、4つの基本的な方法を提供します。
PHPでは、 mysqli_result :: fetch_column関数を使用すると、クエリ結果の列からデータを取得できます。指定された列のすべての値を含む配列を返します。その使用法は次のとおりです。
<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name FROM users"</span></span><span>);
</span><span><span class="hljs-variable">$columnData</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_column</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>); </span><span><span class="hljs-comment">// データの最初の列を取得します</span></span><span>
</span></span>
fetch_columnを直接使用してすべてのデータを取得すると、すべての結果セットが一度にロードされ、データが大きいときに多くのメモリが消費されます。特にデータ量が膨大な場合は、効率を向上させるために、データをPHPのイテレータモードで徐々にロードできます。これにより、メモリを節約して処理速度を改善できます。
Iteratorパターンを介してデータを効率的に処理するために、クラスを作成してIteratorインターフェイスを実装できます。このクラスは、 mysqli_resultオブジェクトをカプセル化し、各列のデータをイテレータを介して徐々に取得します。
最初に、 Iteratorインターフェイスを実装するMySqliresUltiteratorクラスを作成します。このクラスは、 mysqli_resultオブジェクトから行ごとにデータ行を取得し、 fetch_columnが提供するデータを使用できます。
<span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">MysqliResultIterator</span></span><span> </span><span><span class="hljs-keyword">implements</span></span><span> </span><span><span class="hljs-title">Iterator</span></span><span> {
</span><span><span class="hljs-keyword">private</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>;
</span><span><span class="hljs-keyword">private</span></span><span> </span><span><span class="hljs-variable">$column</span></span><span>;
</span><span><span class="hljs-keyword">private</span></span><span> </span><span><span class="hljs-variable">$position</span></span><span>;
</span><span><span class="hljs-keyword">private</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>;
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__construct</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$result</span></span></span><span>, </span><span><span class="hljs-variable">$columnIndex</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-variable language_">$this</span></span><span>->result = </span><span><span class="hljs-variable">$result</span></span><span>;
</span><span><span class="hljs-variable language_">$this</span></span><span>->column = </span><span><span class="hljs-variable">$columnIndex</span></span><span>;
</span><span><span class="hljs-variable language_">$this</span></span><span>->position = </span><span><span class="hljs-number">0</span></span><span>;
</span><span><span class="hljs-variable language_">$this</span></span><span>->data = [];
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">rewind</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-comment">// イテレーターの位置をリセットします</span></span><span>
</span><span><span class="hljs-variable language_">$this</span></span><span>->position = </span><span><span class="hljs-number">0</span></span><span>;
</span><span><span class="hljs-variable language_">$this</span></span><span>->data = </span><span><span class="hljs-variable language_">$this</span></span><span>->result-></span><span><span class="hljs-title function_ invoke__">fetch_column</span></span><span>(</span><span><span class="hljs-variable">$this</span></span><span>->column);
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">current</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-comment">// 現在のデータを返します</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable language_">$this</span></span><span>->data[</span><span><span class="hljs-variable language_">$this</span></span><span>->position];
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">key</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-comment">// 現在の要素のキー名を返します</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable language_">$this</span></span><span>->position;
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">next</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-comment">// 内側のポインターを次の要素に移動します</span></span><span>
++</span><span><span class="hljs-variable language_">$this</span></span><span>->position;
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">valid</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-comment">// 現在の要素が有効かどうかを確認してください</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable language_">$this</span></span><span>->data[</span><span><span class="hljs-variable language_">$this</span></span><span>->position]);
}
}
</span></span>
Iteratorクラスが作成されると、MySQLクエリの結果のデータの列を簡単に反復させることができます。実装方法は次のとおりです。
<span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"username"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"SELECT id, name FROM users"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
</span><span><span class="hljs-comment">// Iteratorインスタンスを作成します,得る "id" 列データ(列インデックスはです0)</span></span><span>
</span><span><span class="hljs-variable">$iterator</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">MysqliResultIterator</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span><span><span class="hljs-comment">// 繰り返し、すべてを出力します ID データ</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$iterator</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ID: <span class="hljs-subst">$value</span></span></span><span>\n";
}
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>
この例では、Query結果のデータの最初の列をMySqliresUltiteratorを介して通過し、各ID行を行ごとに出力します。 Iteratorモードにより、データセット全体を一度にロードせずに徐々にデータにアクセスでき、過度のメモリ消費の問題を回避できます。
Iteratorパターンと組み合わせることで、 FETCH_COLUMN関数は、データをより効率的に取得するのに役立つだけでなく、すべてのデータを一度にメモリにロードするのではなく、段階的にデータをロードすることもできます。これは、特にメモリが制約されている場合、大量のデータを処理するのに非常に役立ちます。
mysqli_result :: fetch_columnとphp iteratorモードを組み合わせることにより、mysqlクエリ結果の効率的なトラバーサルを実装できます。イテレータモードは、クエリ結果全体を一度にメモリにロードすることを避けるためのメモリ効率の高い方法を提供します。このパターンを使用して、大量のデータを処理する際に、コードの保守性とパフォーマンスを改善できます。
関連タグ:
mysqli_result