簡體   English   中英

從MySQL鏈接表SELECT查詢創建PHP多維關聯數組

[英]Create PHP multidimension associative array from MySQL linked tables SELECT query

我希望有人可以幫我解決這個問題。

假設我有3個DB表:

Users:
user_id, user_name
100, John
101, Jessica

Cars:
car_id, car_name
30, Corvette
31, BMW


UsersCars:
user_id, car_id, car_colour
100, 30, Red
101, 30, Green
101, 31, Green

(so John got a red corvette and Jessica has a green Corvette and a BMW)

我想有代碼返回一個多維PHP數組,如:

Array
(
    [100] => Array
    (
        [user_id] => 100
        [user_name] => John
        [cars] => Array
        (
            [car_id]=>30,
            [car_name]=>'Corvette',
            [car_colour]=>'Red'

        )            
    )
    [101] => Array
    (
        [user_id] => 101
        [user_name] => Jessica
        [cars] => Array
        (
            [0] => Array
            (
                [car_id]=>30,
                [car_name]=>'Corvette',
                [car_colour]=>'Green'
            ),
            [1] => Array
            (
                [car_id]=>31,
                [car_name]=>'BMW',
                [car_colour]=>'Green'
            )
        )            
    )
)

我有以下SQL

SELECT u.*, c.* FROM Users u
LEFT JOIN UsersCars uc ON u.user_id = uc.user_id
LEFT JOIN Cars c ON uc.car_id = c.car_id

和PHP

$result = mysqli_query($db, $q);
while ($row = mysqli_fetch_assoc($result)) {
    $users_with_cars[$row['user_id']] = $row;
}

但這不正確。 任何人都知道如何解決這個導致上面的數組(考慮到性能)? 我寧願不想硬編碼“汽車”的例外情況,這種情況可能不止一次發生。 我寧願看一些只看$ row和$ users_with_cars的內容,當看到一些新值時,它會通過將舊值轉換為數組來附加它。 也許已經有一個原生的PHP功能呢? 或者更好,也許我的MySQL或整個方法是錯誤的?

任何幫助或提示贊賞。

問候


更新已解決

這是一個更新,也許我可以幫助別人我最終如何解決它。

我最終總是使用一個或多個汽車的數組,我調整表格總是有一個“id”作為列名。 這樣您就可以輕松擴展它。 見例子;

Users:
id, name
100, John
101, Jessica

Cars:
id, name
30, Corvette
31, BMW


UsersCars:
user_id, car_id, car_colour
100, 30, Red
101, 30, Green
101, 31, Green



$q = 'SELECT u.*, c.id as car_id, c.name as car_name, uc.colour as car_colour FROM Users u
LEFT JOIN UsersCars uc ON u.id = uc.user_id
LEFT JOIN Cars c ON uc.car_id = c.id';

$result = mysqli_query($db, $q);
while ($row = mysqli_fetch_assoc($result)) {
    $users_with_cars[] = $row;
}
$joins = array('cars' => array('car_id'=>'id','car_name'=>'name','car_colour'=>'colour'));
$users_with_cars = create_join_array($users_with_cars, $joins);

print_r($users_with_cars);



function create_join_array($rows, $joins){
    /* build associative multidimensional array with joined tables from query rows */

    foreach((array)$rows as $row){
        if (!isset($out[$row['id']])) {
            $out[$row['id']] = $row;
        }

        foreach($joins as $name => $item){
            unset($newitem);
            foreach($item as $field => $newfield){
                unset($out[$row['id']][$field]);
                if (!empty($row[$field]))
                    $newitem[$newfield] = $row[$field];
            }
            if (!empty($newitem))
                $out[$row['id']][$name][$newitem[key($newitem)]] = $newitem;
        }
    }

    return $out;
}

這一切都導致了美麗的陣列:

Array
(
    [100] => Array
    (
        [id] => 100
        [name] => John
        [cars] => Array
        (
            [30] => Array
            (
                [id]=>30
                [name]=>'Corvette',
                [colour]=>'Red'
            )
        )            
    )
    [101] => Array
    (
        [id] => 101
        [name] => Jessica
        [cars] => Array
        (
            [30] => Array
            (
                [id]=>30,
                [name]=>'Corvette',
                [colour]=>'Green'
            ),
            [31] => Array
            (
                [id]=>31,
                [name]=>'BMW',
                [colour]=>'Green'
            )
        )            
    )
)

假設用戶也可以擁有多輛自行車。 然后,您有多個連接數組,您可以使用左連接輕松綁定並將其添加到連接數組。

$q = 'SELECT u.*, c.id as car_id, c.name as car_name, uc.colour as car_colour, b.id as bike_id, b.name as bike_name FROM Users u
LEFT JOIN UsersCars uc ON u.user_id = uc.user_id
LEFT JOIN Cars c ON uc.car_id = c.id
LEFT JOIN UsersBikes ub ON u.user_id = ub.user_id
LEFT JOIN Bikes b ON ub.bike_id = b.id';

$result = mysqli_query($db, $q);
while ($row = mysqli_fetch_assoc($result)) {
    $users_with_cars_bikes[] = $row;
}

$joins = array('cars' => array('car_id'=>'id', 'car_name'=>'name', 'car_colour'=>'colour'), 
               'bikes' => array('bike_id'=>'id', 'bike_name'=>'name'));
$users_with_cars_bikes = create_join_array($users_with_cars_bikes, $joins);

print_r($users_with_cars_bikes);

會產生類似的結果

Array(
    [100] => Array
    (
        [id] => 100
        [name] => John
        [cars] => Array
        (
            [30] => Array
            (
                [id]=>30
                [name]=>'Corvette',
                [colour]=>'Red'
            )
        )
        [bikes] => Array
        (
            [41] => Array
            (
                [id]=>41
                [name]=>'BMX'
            )
        )           
    )
)

等等..

謝謝大家幫忙:)

這是我能想到的。 它(可能)會像您想要的輸出一樣創建一個數組。 不知道它是否會起作用,我在這里寫了這個沒有測試。 讓我知道! :)

$result = mysqli_query($db, $q);
while ($row = mysqli_fetch_assoc($result)) 
{
    // Add user ID and name to the array
    $users_with_cars[$row['user_id']]['user_id'] = $row['user_id'];
    $users_with_cars[$row['user_id']]['user_name'] = $row['user_name'];
    // Check if this user has cars in the array. If not, this is the first car (see else)
    if(isset($users_with_cars[$row['user_id']]['cars']))
    {
        // Check if there is exactly 1 car in the array
        if(count($users_with_cars[$row['user_id']]['cars']) == 1)
        {
            // If yes, put that car in a 'sub array'
            $users_with_cars[$row['user_id']]['cars'] = array(0 => $users_with_cars[$row['user_id']]['cars']);
            // Then add the new car
            $users_with_cars[$row['user_id']]['cars'][] = array('car_id' => $row['car_id'], 'car_name' => $row['car_name'], 'car_color' => $row['car_color']);
        }
        else
        {
            // It already has more than one car in the array. Just add it
            $users_with_cars[$row['user_id']]['cars'][] = array('car_id' => $row['car_id'], 'car_name' => $row['car_name'], 'car_color' => $row['car_color']);
        }
    }
    else
    {
        // Add a single car without 'sub array'
        $users_with_cars[$row['user_id']]['cars']['car_id'] = $row['car_id'];
        $users_with_cars[$row['user_id']]['cars']['car_name'] = $row['car_name'];
        $users_with_cars[$row['user_id']]['cars']['car_color'] = $row['car_color'];
    }
}


編輯:

這是我在評論中提到的一個例子:

 $result = mysqli_query($db, $q); while ($row = mysqli_fetch_assoc($result)) { $count = count($users_with_cars[$row['user_id']]['cars']); foreach($row AS $key => $value) { if(substr($key, 0, 4) == "car_") { // Single: $users_with_cars[$row['user_id']]['cars'][$key] = $value; // Multiple: $users_with_cars[$row['user_id']]['cars'][$count][$key] = $value; } } } 
$result = mysqli_query($db, $q);
$users_with_cars = array();
while ($row = mysqli_fetch_assoc($result)) {
    if (!isset($users_with_cars[$row['user_id']])) {
        $user = array();
        $user['user_id'] = $row['user_id'];
        $user['user_name'] = $row['user_name'];
        $user['cars'] = array();
        $users_with_cars[$row['user_id']] = $user;
    }
    $car = array();
    $car['car_id'] = $row['car_id'];
    $car['car_name'] = $row['car_name'];
    $car['car_colour'] = $row['car_colour'];
    $users_with_cars[$row['user_id']]['cars'] = $car;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM