web-dev-qa-db-ja.com

PDO連想配列-連想配列を返す

私はこのコードを持っています:

$dbInstance = DB_Instance::getDBO();
$statement = $dbInstance->prepare("SELECT id, name FROM language ORDER BY id");
$statement->execute();      
$rows = $statement->fetchAll(); 

//Create associative array wuth id set as an index in array
$languages = array();
foreach($rows as $r) {
    $languages[$r['id']] = $r['name'];
}
return $languages;

PDOステートメントを使用して配列$ languagesが生成するのと同じ結果を達成する方法を理解できません。私はいくつかの異なるfetch_stylesを試しました。

私はいくつかの異なるスタイルを試しましたが、次のようになりました。

[0] svenska
[1] engelska

しかし、私は好きが欲しい:

[1] svenska
[2] engelska

(ここで、1と2はデータベース内のidの値です)

関数を作成してFETCH_FUNCで呼び出すことができると思いますが、それがそれほど素晴らしいかどうかもわかりません。

上記はそれを行うための最良/最もクリーンな方法ですか?

もっと良い方法があるかどうかはよくわかりません。あなたはこれを試すことができますか?

$rows = $statement->fetchAll(PDO::FETCH_ASSOC);

$languages = array();

function getLangs($col, $row) {
     $languages[$col['id']] = $col['name'];
}

array_walk($rows, 'getLangs');

Foreachループには何の問題もありません。私は実際にあなたが持っているものを使います。それよりきれいにするのは難しいです...

更新:

質問を注意深く読み直した後、本当に質問する必要があるのは、結果が別の形式で返されるようにクエリをフォーマットできるかどうかです。

したがって、通常のSELECTクエリが返される方法は次のとおりです。

+----+----------+
| id |     name |
+----+----------+
|  1 |  svenska |
|  2 | engelska |
| .. |      ... |
| .. |      ... |
+----+----------+

$row = array(
    row_1 => array(
        id   => "1",
        name => "svenska"
    ),
    row_2 => array(
        id   => "2",
        name => "engelska"
    ),
    row_3 => array(
        id   => "...",
        name => "..."
    ),
    row_4 => array(
        id   => "...",
        name => "..."
    )
)

$row[$row_number][$column_name] = $value

あなたが求めているのは、次のようなクエリ結果を返す方法です。

// Query result is only one row, with each 'id' as column name
// And the 'name' from the same row as it's value...

+---------+----------+-----+-----+-----+
|       1 |        2 | ... | ... | ... |
+---------+----------+-----+-----+-----+
| svenska | engelska | ... | ... | ... |
+---------+----------+-----+-----+-----+

$row = array(
    row_1 => array(
          1 => "svenska",
          2 => "engelska",
        ... => "...",
        ... => "...",
        ... => "..."
    )
)

$languages = $row[row_1];
$languages[$id] = $name;

正直に言うと、SQLでできるかどうかは完全にはわかりません これを行う 。できたとしても、私はそれに対してもお勧めします。スケーリングテーブルにとっては恐ろしいことです。テーブルが静的な場合は、最初に述べた方法でフォーマットしてみませんか?インクルードファイルの静的PHP配列に入れてみませんか?

13
jdstankosky

誰もが忘れていた

$sth->fetchAll(PDO::FETCH_KEY_PAIR);
20
Miron Yanovskiy

$result = $sth->fetch(PDO::FETCH_ASSOC);を探しているのではないかと思います

参照: http://php.net/manual/en/pdostatement.fetch.php

[編集]おっと遅くまで:)

8
tattooedgeek