2011-09-16 45 views
36

Tất cả bây giờ và sau đó, tôi nhận được vào một tình huống khi tôi có một truy vấn tương tự bằng hiện vật để:nhóm PDO fetchAll cặp khóa-giá trị vào mảng assoc

SELECT `key`, `value` FROM `settings`; 

Trong trường hợp này, tôi muốn để có được một kết mảng, sử dụng các giá trị của key & value làm các mục tương ứng của mảng đó, ví dụ: nếu cơ sở dữ liệu chứa: ('first_name', 'Tom'), ('last_name', 'Jeferson'), mảng phải là array('first_name' => 'Tom', 'last_name' => 'Jeferson');.

Cách phổ biến nhất để làm điều này là:

$settings_flat = $db 
    ->query("SELECT `name`, `value` FROM `settings`;") 
    ->fetchAll(PDO::FETCH_ASSOC); 

$settings = array(); 

foreach ($settings_flat as $setting) { 
    $settings[$setting['name']] = $setting['value']; 
} 

* Một cách khác để làm điều này là bằng cách gọi fetchAll(PDO::FETCH_COLUMN) hai lần & sau đó sử dụng array_combine để tạo mảng. Tuy nhiên, vì nó liên quan đến hai cuộc gọi hai cơ sở dữ liệu, tôi bỏ qua điều này như là một tùy chọn.

Có cách nào khác để thực hiện việc này không?

Trả lời

76

Đối với vấn đề của bạn có giải pháp khá sẵn sàng, đó là:

$q = $db->query("SELECT `name` AS name, `value` AS value FROM `settings`;"); 
$r = $q->fetchAll(PDO::FETCH_KEY_PAIR); 

trình đối với tôi, trên PostgreSQL 9.1, và PHP 5.3.8 chạy trên Windows 7 x64.

+3

Tuyệt vời! Không biết về hằng số này. Rõ ràng PDO tìm nạp trang tài liệu không liệt kê tất cả. Mặc dù, 'AS name, AS value' bit là thừa. – Gajus

+0

Ngoài ra, không biết, IDE của tôi đã đánh dấu nó cho tôi ...) – devdRew

+1

Có cách nào để sử dụng 'PDO :: FETCH_KEY_PAIR' và có đầu ra là một' đối tượng' cùng một lúc không? – adamj

-3
$query = $db->query("SELECT `name` AS name, `value` AS value FROM `settings`;"); 
$result = $query->fetchAll(PDO::FETCH_ASSOC); 
Các vấn đề liên quan