Ilişkisel dizi anahtarı olarak sütun diğer adı dön

2 Cevap php

Ben şu var ki:

$query = "
    SELECT user_id,email,password, roles.role_id,role_name
    FROM users
    JOIN roles USING(role_id)
    LIMIT 1
    ";
$result = mysql_query($query);
$user = mysql_fetch_assoc($result);

Ben ($ kullanıcı) print_r sonra ben alıyorum:

Array(
    [user_id] => 1 
    [email] => example@example.com
    [password] => 5f4dcc3b5aa765d61d8327deb882cf99
    [role_id] => 1 
    [role_name] => admin 
    )

Ben select sorgusunda benim sütun adları için takma adlar kullanarak biraz bu dizi temizlemek istiyorum. I user_id id kolayca yeterli ile değiştirebilirsiniz ama ben de role_id ve onlar verdiğini role_name gibi adlar için seçmek istiyorum role => array (id => 1, name => admin).

Örneğin, ben (hangi çalışmaz) aşağıdaki denedim:

$query = "
    SELECT user_id AS id,email,password, roles.role_id AS role[id],role_name AS role[name]
    FROM users
    JOIN roles USING(role_id)
    LIMIT 1
    ";

Ben bu dönmek istiyorum dizi gibi görünecektir:

Array(
    [id] => 1 
    [email] => example@example.com
    [password] => 5f4dcc3b5aa765d61d8327deb882cf99
    [role] => Array(
        [id] => 1
        [name] => admin
        )
    )

2 Cevap

Standart mysql_fetch_assoc yöntem sizin için bu yapmayacağım: Bazı post-prodüksiyon kendiniz yapmak zorundasınız.

function my_assoc($result) {
    $row = mysql_fetch_assoc($result);
    if (is_array($row)) {
        $out = array();
        foreach ($row as $field => $value) {
            if (preg_match('/^([^\]]+)\[([^\]]+)\]$/', $field, $matches) {
                $out[$matches[1]][$matches[2]] = $value;
            } else {
                $out[$field] = $value;
            }
        }
        return $out;
    } else {
        return $row;
    }
}

Girinti tek bir düzeyde bu sadece çalışır (if it works at all -- untested) (yani, foo[bar][baz] ele olmayacak).

Yalnız () Mysql_Fetch_Assoc ile bunu yapamaz.

If you really need a multi-dimensional array, you have to do it manually. Possibly create a helper function that loops over a retrieved record, and consolidates multiple keys with the same prefix (in your case, "role_").

Birçok mevcut veritabanı kütüphaneleri sizin için bu işi yapacak. Örneğin, CakePHP'nin veritabanı yardımcısı gibi bir dizi dönecekti

Array(
 [User] => array('id' => 1, 'email' => '...'),
 [Role] => array('id' => 1, ...), 
)