1

fetchAllページのphp.orgにコメントがあります。

FETCH_GROUPテーブルの主キーを配列キーとして使用するとFETCH_ASSOC同時に、次のコマンドを使用したいと思うかもしれません。

// $stmt is some query like "SELECT rowid, username, comment" 
$results = $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);  
// It does work, but not as you might expect:  
$results = array(  
  1234 => array(0 => array('username' => 'abc', 'comment' => '[...]')),  
  1235 => array(0 => array('username' => 'def', 'comment' => '[...]')), );

しかし、少なくとも役に立たない番号付き配列を簡単に取り除くことができます。

$results = array_map('reset', $results);

コードは期待どおりに機能し、すべてが次の行だけで実行されます。

array_map('reset', $results);

ドキュメントのarray_mapとreset関数を読んだ後、両方を1行に組み合わせたときに結果がどのように生成されるのかよくわかりません。

それは安全な解決策ですか?この種の1行をお勧めしますか、それとも副作用であり、使用しないでください。つまり、同じ結果を生成するために単純な古いループを作成する必要がありますか?

2つの標準機能を組み合わせた単一ラインソリューションは、私にとって非常に魅力的なソリューションです。驚きがないことを確認したいだけです。

4

2 に答える 2

3

ここでの秘訣はreset、この場合、(の$ resultsを反復処理することをお勧めしますarray_map)がに等しいこと$results[$i][0]です。reset、内部ポインタの巻き戻しに加えて、渡された配列の最初の要素を、それと同じくらい単純に返します。

補足として、 ArrayAccessインターフェイスPDO::FETCH_CLASSを実装してこの動作を実現することをお勧めします。

于 2013-01-24T05:21:41.643 に答える
-1

はい、安全です。array_map()配列メンバーをコールバック関数の結果に置き換え、配列のreset()最初のメンバーを返します。
それで、

array(0 => array('username' => 'abc', 'comment' => '[...]'))

に置き換えられます

array('username' => 'abc', 'comment' => '[...]')

前の行からこの行をreset()返します。

しかし、正直なところ、これは私には決して存在しなかった一種の問題です。
API関数のみを使用してワンライナーを作成し、1つのルール(「ユーザー定義関数は一切使用しない」)を遵守するための驚くべきステートメントを作成するというアイデアの魅力がわかりません。
私は自分でどんな関数でも作ることができます、そしてそれは呼び出されたときにこれらのコードツイストのどれよりも短くなりますが、それでも本文にわかりやすく読みやすい構文があり、書き込みと読み取りの両方で頭を悩ませることなく、自分自身に質問することはありません安全な?"。

したがって、実際のワンライナーは、私の安全で便利なデータベースアクセスライブラリの getIndファミリ関数です(プライマリインデックスだけでなく、任意のフィールドをキーとして使用できます)。

$data = $db->getInd("id", "SELECT * FROM table WHERE category=?i", $cat);
$dic  = $db->getIndCol("name", "SELECT name, id FROM cities");

これらは実際のワンライナーであり、クエリの実行、パラメータのバインドなど、内部ですべての汚い反復的なジョブを実行していることに気付くかもしれません。

于 2013-01-24T05:19:00.057 に答える