簡體   English   中英

從MySQL查詢構建多維PHP數組

[英]Build a multidimensional PHP array from MySQL query

我正在嘗試從MySQL查詢創建多維數組。 該陣列深3層。 每個用戶都有一個membershipid ,此成員資格ID可以具有多個characterid 每個這些characterid可以具有多個屬性。

Membershipid-> characterid(最多3個)-> light,racehash。

    $query = "SELECT p.membershipid, p.displayname, c.characterid, c.light, c.racehash
    FROM Players as p
    LEFT JOIN Characters as c
    ON c.membershipid = p.membershipid";
    $result = $mysqli->query($query) or die("SQL Error: Members konden niet worden opgehaald.");

    // Loop through the requested data, add to an array
    while ($data = mysqli_fetch_assoc($result)) {
        $categorylist[ $data['membershipid'] ] = array(
                    'displayname' => $data['displayname'],
              array('characterid' => $data['characterid'],
                    'light' => $data['light'],
                          'racehash' => $data['racehash']
            )
                    );

    } // end while statement

// A test to see how many items in array          
echo "<pre>\n";
print_r($categorylist);    
echo "</pre>\n";  

此方法有效,但每個人僅顯示一個字符,而查詢結果顯示每個membership id每個character id membership id

    Array
(
    [4611686018428931875] => Array
        (
            [displayname] => White_Anomaly
            [0] => Array
                (
                    [characterid] => 2305843009264668680
                    [light] => 554
                    [racehash] => 3887404748
                )

        )

    [4611686018437972738] => Array
        (
            [displayname] => Bpunisher7
            [0] => Array
                (
                    [characterid] => 2305843009277456739
                    [light] => 392
                    [racehash] => 2803282938
                )

        )

SQL查詢的結果如下: 查詢結果

我可能在數組定義上做錯了,每次都覆蓋了我的characterid,因為我只得到了最新的characterid

首選數組:

Array
(
    [4611686018428931875] => Array
        (
            [displayname] => White_Anomaly
            [characters] => Array
                (
                    [0] => Array
                        (
                            [characterid] => 2305843009264668678
                            [light] => 370
                            [racehash] => 3887404748
                        )
                    [1] => Array
                        (
                            [characterid] => 2305843009264668680
                            [light] => 554
                            [racehash] => 3887404748
                        )
                )
        )

    [4611686018437972738] => Array
        (
            [displayname] => Bpunisher7
            [characters] => Array
                (
                    [0] => Array
                        (
                            [characterid] => 2305843009265241161
                            [light] => 534
                            [racehash] => 2803282938
                        )
                    [1] => Array
                        (
                            [characterid] => 2305843009265241163
                            [light] => 524
                            [racehash] => 3887404748
                        )
                    [2] => Array
                        (
                            [characterid] => 2305843009277456739
                            [light] => 392
                            [racehash] => 3887404748
                        )
                )
        )
)

如果您允許我稍微重組結果數組,這應該是一種更好的方法:

// Loop through the requested data, add to an array
while ($data = mysqli_fetch_assoc($result)) {
    extract($data,EXTR_PREFIX_ALL,'data');
    $categorylist[$data_membershipid]['displayname']     = $data_displayname;
    $categorylist[$data_membershipid][$data_characterid] = ['light'    => $data_light,
                                                            'racehash' => $data_racehash];

} // end while statement

如您所見,我已經將“字符ID”移到了子數組的鍵上。 這樣做是為了避免覆蓋其他字符。

我還對數組使用了新的表示法。 其中的extract()只是使代碼更易於閱讀,但您可以擺脫它。

也許最好將字符放在自己的數組中,如下所示:

// Loop through the requested data, add to an array
while ($data = mysqli_fetch_assoc($result)) {
    extract($data,EXTR_PREFIX_ALL,'data');
    $categorylist[$data_membershipid]['displayname'] = $data_displayname;
    $categorylist[$data_membershipid]['characters'][$data_characterid] = ['light'    => $data_light,
                                                                          'racehash' => $data_racehash];

} // end while statement

如果$ categorylist [$ data ['membershipid']]存在,則下一個字符將覆蓋它。

您必須檢查$ categorylist [$ data ['membershipid']]是否存在。 在這種情況下,請使用array_push()添加第二個字符。 否則,您的代碼仍然有效。

暫無
暫無

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

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