2013-03-20 121 views
8

我有這樣的代碼: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語句來達到同樣的結果數組$語言產生。我嘗試了一些不同的fetch_styles。

我已經嘗試了一些不同的風格,我能得到這樣的:

[0] svenska 
[1] engelska 

,但我想這樣的:

[1] svenska 
[2] engelska 

(其中1和2是數據庫ID的值)

我想我可以創建一個函數,並調用FETCH_FUNC,但我不確定這將是如此之好。

以上是最好的/最乾淨的方法嗎?

+3

如果要返回與PDO的關聯數組,你'$行= $陳述書>使用fetchall(PDO :: FETCH_ASSOC);'然後你可以通過'$引用行[$ row_num] [$ col_name]' – jdstankosky 2013-03-20 15:53:52

+0

我明白你現在要求什麼。請參閱我更新的答案以解決您的特定查詢。 – jdstankosky 2013-03-20 16:49:19

回答

10

不能確定是否有任何更好的辦法。你可以試試這個嗎?

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

$languages = array(); 

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

array_walk($rows, 'getLangs'); 

foreach循環沒有問題。我實際上會使用你所擁有的。很難比這更清潔......

UPDATE:

後重新仔細閱讀了你的問題,你真正應該問的是你是否能以這樣的方式格式化您的查詢結果以不同的格式返回。

則返回正常的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; 

我m不完全確定你在SQL中使用do this,這是非常誠實的。即使可以,我也會建議不要這樣做。這將是一個可怕的縮放表。如果你的表是靜態的,那麼爲什麼不按照剛纔提到的方式來格式化呢?爲什麼不把它放在包含文件中的靜態PHP數組中?

+0

謝謝! :-) 你什麼意思。爲什麼我應該將它包含在包含文件中的靜態PHP數組中?那有什麼意義呢? – bestprogrammerintheworld 2013-03-21 19:31:57

+0

@bestprogrammerintheworld我不知道它是否是一個靜態表,因爲語言會一直存在,而且他們在數據庫中的唯一原因是用查詢來查找它們,爲什麼不創建一個數組(例如'include「lang.php」;'?再一次,我沒有關於表格的其他知識,所以我只是在這裏推斷。 – jdstankosky 2013-03-22 13:17:56

+0

好的,謝謝你的提示! - ) – bestprogrammerintheworld 2013-03-23 07:13:54

13

大家都忘了

$sth->fetchAll(PDO::FETCH_KEY_PAIR); 
+0

如果您使用多個列,這可能是一個更好的解決方案: '$ STH-> fetchAll(PDO :: FETCH_ASSOC);' – dangre00 2016-11-23 00:20:35