【问题标题】:Build a multidimensional PHP array from MySQL query从 MySQL 查询构建多维 PHP 数组
【发布时间】:2018-10-03 10:22:05
【问题描述】:

我正在尝试从 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";  

这可行,但仅显示每个人的 1 个字符,而查询结果显示每个 membership id 的每个 character 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
                        )
                )
        )
)

【问题讨论】:

    标签: php mysql arrays multidimensional-array


    【解决方案1】:

    如果您允许我稍微重构您的结果数组,这应该是更好的方法:

    // 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
    

    如您所见,我已将“characterid”移动为子数组的键。这样做是为了您不会覆盖另一个字符。

    我还对数组使用了较新的表示法。 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
    

    【讨论】:

    • 感谢这帮助我将正确的数据放入数组中。现在我可以循环遍历这个数组来构建一个表格来显示信息。
    • 如果我可以跟进您的解决方案。我已经实现了你所说的,但是如果我想从创建的数组中打印出数据,我该怎么做?由于数组对所有内容都有不同的(字符)ID。
    • 我在回答中添加了一些内容,但我不太明白你的问题。您能否指定您的意思:“从创建的数组中打印出数据”?
    【解决方案2】:

    如果 $categorylist[ $data['membershipid'] ] 存在,它将被下一个字符覆盖。

    您必须检查 $categorylist[ $data['membershipid'] ] 是否存在。在这种情况下,使用 array_push() 添加第二个字符。否则你的代码仍然有效。

    【讨论】:

      猜你喜欢
      • 2016-12-07
      • 2015-04-30
      • 2018-01-03
      • 1970-01-01
      • 2011-07-17
      • 2012-09-02
      • 1970-01-01
      • 2012-10-29
      • 2011-10-26
      相关资源
      最近更新 更多