【问题标题】:Creating a 3D array from MYSQL results in php在 php 中从 MYSQL 创建 3D 数组
【发布时间】:2026-01-14 23:35:01
【问题描述】:

我正在尝试使用数据库表中的信息填充网格。我设法使用蛮力和 mysql 来实现这一点,但是现在我正在将代码升级到 mysqli,我想以一种更优雅的方式来做到这一点。 这是我想要的输出:

|--------------------|--------| |col0row0 标题 |col1row0 标题 | |col0row0 作者 |col1row0 作者 | |col0row0 电子邮件 |col1row0 电子邮件 | |------------------------------------------------------| |col0row1 标题 |col1row1 标题 | |col0row1 作者 |col1row1 作者 | |col0row1 电子邮件 |col1row1 电子邮件 | |------------------------------------------------------| |依此类推后续行

我过去曾使用非常丑陋的代码来做到这一点,如下所示:

for($x=0;$x<$numberSides;$x++) {
    for ($y=0;$y<$numberRows;$y++) {        
        $queryString[$x][$y] = "SELECT * from comments WHERE topic_id = '1' AND col = '{$x}' AND row = '{$y}' ";
    }
}


$col0Row0_mysqlQuery = mysql_query($queryString[0][0] , $commenting_conn) or die(mysql_error());
$col0Row1_mysqlQuery = mysql_query($queryString[0][1] , $commenting_conn) or die(mysql_error());
$col0Row2_mysqlQuery = mysql_query($queryString[0][2] , $commenting_conn) or die(mysql_error());
$col1Row0_mysqlQuery = mysql_query($queryString[1][0] , $commenting_conn) or die(mysql_error());
$col1Row1_mysqlQuery = mysql_query($queryString[1][1] , $commenting_conn) or die(mysql_error());
$col1Row2_mysqlQuery = mysql_query($queryString[1][2] , $commenting_conn) or die(mysql_error());

// load those into output arrays
$col0Row0_output = mysql_fetch_assoc($col0Row0_mysqlQuery);
$col0Row1_output = mysql_fetch_assoc($col0Row1_mysqlQuery);
$col0Row2_output = mysql_fetch_assoc($col0Row2_mysqlQuery);
$col1Row0_output = mysql_fetch_assoc($col1Row0_mysqlQuery);
$col1Row1_output = mysql_fetch_assoc($col1Row1_mysqlQuery);
$col1Row2_output = mysql_fetch_assoc($col1Row2_mysqlQuery);

然后我会为网格中的每个字段回显 col0row0_output['title']、col0row0_output['author'] 等,以获得我想要的输出。这不是编写此代码的有效方法,但我是初学者,所以我做了我必须让它用于演示的方法。

我的表格中的每条评论都已经包含一个列和一个行字段,所以我想将其直接转换到网格中。进一步解释:每个方格可以有多个评论。所以记录可能如下所示:

Table fields: "title" / "author" / "email" / "row" / "col" Record 0: TitleA /AuthorA /EmailA /0 /0 Record 1: TitleB /AuthorB /EmailB /1 /0 Record 2: TitleC /AuthorC /EmailC /0 /1 Record 3: TitleD /AuthorA /EmailA /1 /1 Record 4: TitleE /AuthorB /EmailB /0 /0

因此记录 0 和记录 4 都在网格正方形 0,0 中。 我现在正试图移动到一个循环和一个 3D 数组以使其工作。我希望能够创建 3D 数组,以便我的 echo 命令类似于 col0row0 的标题字段的 output[0][0]['title'],output[1][0]['author' ] 为 col1row0。

我也正在远离 mysql 并用 mysqli 代替它。(PDO 对我来说有点太高级了,但如果人们认为 PDO 有最好的解决方案,我想我可以从你的回复中学习)。

例如,我可以创建一个将 SQL 结果存储为数组的循环吗?例如:

for($x=0;$x<$numberSides;$x++) {
    for ($y=0;$y<$numberRows;$y++) {        
        $queryString[$x][$y] = "SELECT * from comments WHERE topic_id = '1' AND col = '{$x}' AND row = '{$y}' ";
        $sqlResult[$x][$y] = mysqli_query($connection, $queryString[$x][$y]);
        $resultArray[$x][$y] = mysqli_fetch_assoc($sqlResult[$x][$y]);
    } 
}

这行得通吗?有没有一种优雅的方式来实现我希望做的事情?我很感激这方面的任何指导。谢谢!

【问题讨论】:

  • Arrsy[0] = array[''][''] 是这个 3d

标签: php mysql arrays pdo mysqli


【解决方案1】:

表格:

CREATE TABLE `comments` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `title` varchar(128) DEFAULT NULL,
    `author` varchar(128) DEFAULT NULL,
    `email` varchar(128) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

php:

<?php
// PDO
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$statement = $pdo->query("SELECT * from comments");
$results = $statement->fetchAll(PDO::FETCH_ASSOC);

$columns = 2;

//make two dimensional array
$multiArray = Array();
$row = Array();
$cellNumber = 1;
foreach ($results as $result) {
    $row[] = $result;
    if (0 == ($cellNumber % $columns)) {
        $multiArray[] = $row;
        $row = Array();
    }
    $cellNumber++;

}
var_dump($multiArray);

但您可以将数据存储在平面表格中,并以行和列的形式显示。

【讨论】:

  • 谢谢@Styx。我的表中的每条评论都已经包含一列和一个行字段,所以我想将其直接翻译到网格中。我认为您的解决方案没有考虑到这一点,因此您将 cmets 布置在表格中。进一步解释:每个方格可以有多个评论。所以我的记录可能看起来像这样:Record 0: TitleA/AuthorA/EmailA/0/0 Record 1: TitleB/AuthorB/EmailB/1/0 Record 2: TitleC/AuthorC/EmailC/0/1 Record 3: TitleD/AuthorA/EmailA/1/1 Record 4: TitleE/AuthorB/EmailB/0/0 因此记录 0 和记录 4 都在网格正方形 0,0 中。
【解决方案2】:

想通了:

for($x=0;$x<$numberSides;$x++) {
for ($y=0;$y<$numberRows;$y++) {        
    $queryString[$x][$y] = "SELECT * FROM comments WHERE topic_id = '{$topicid}' AND side = '{$x}' AND row = '{$y}'";
    $result[$x][$y] = mysqli_query($db_connection,$queryString[$x][$y]) or die(mysqli_error($db_connection));
    while($eachcomment = mysqli_fetch_assoc($result[$x][$y])) {
        $array[$x][$y][] = $eachcomment;
    }
}

}

FTW。 :)

【讨论】: