【问题标题】:How to populate PHP 3D array from MySQL如何从 MySQL 填充 PHP 3D 数组
【发布时间】:2012-09-06 11:32:48
【问题描述】:

由于我之前的问题简化了,我正在尝试在 PHP 中学习 3D 数组,但每节课我都变得难以理解。

我已经准备了带有空 3D(分层)数组的代码,但不知道如何:

  1. 用 MySQL 数据库中的数据填充它
  2. 显示/引用它,如:echo $result_value[x][y][z] 给出 value

.

include_once 'connect.php';

$player_id = '6';
$result_value = array();

$pullMapInfo = "SELECT x, y, z, value FROM mapinfo WHERE id='{$player_id}'";
$pullMapInfo2 = mysql_query($pullMapInfo) or die(mysql_error());

while ( $pullMapInfo3 = mysql_fetch_assoc($pullMapInfo2) ) {
    $result_value = array(
                          array(
                              array('', '', ''),
                              array('', '', ''),
                              array('', '', ''),
                          ),
                          array(
                              array('', '', ''),
                              array('', '', ''),
                              array('', '', ''),
                          ),
                          array(
                              array('', '', ''),
                              array('', '', ''),
                              array('', '', ''),
                          )
                      );
}

for($z = 1; $z <= 3; $z++){
for($x = 1; $x <= 16; $x++){
for($y = 1; $y <= 16; $y++){
    # echo database row's divided among layers (z parameter) for ex.: 1,1,1 = red (X,Y,Z = color value) - 1 width & 1 height on 1st layer contains red value
    # to get access to it like this: $result_value[x][y][z] => [value];
}
}
}

【问题讨论】:

  • 为什么需要多维数组?
  • 这与我的问题的性质无关
  • 清楚地了解问题的上下文通常更方便,有时它可以让我们通过问题的替代方法给出更好的答案。在这种情况下,我本可以建议使用 3dPoint 类和 mysql_fetch_object 的 OOP 替代方案。当他们要求澄清时,回答愿意帮助你的人也被认为很好。

标签: php mysql arrays multidimensional-array


【解决方案1】:
populate it with data from MySQL database
display it/reffer to it like: echo $result_value[x][y][z] gives value

填充阶段只是简单地选择至少xyzvalue 字段。

然后,在一个循环中,您检索所有数据。此时,您检查数组先决条件是否存在,如果不存在,则设置它们并设置值:

<?php
    $db = mysql_connect($db_host,$db_user,$db_password) or die($error[0])

    $arr3d = array();

    /* Initialization to get a "dense" array
    $z_row = array_fill(0, $max_z, '<DEFAULT>');
    $y_row = array_fill(0, $max_y, $z_row);
    $arr3d = array_fill(0, $max_x, $y_row);
    unset($y_row, $z_row); // Do not waste memory
    */

    $query = 'SELECT x, y, z, value FROM ...;'   ;

    $handle = mysql_query($query) or die("$query: error: " . mysql_error());

    while($row = mysql_fetch_array($handle))
    {
        // $row is an array with x, y, z and value keys in this order
        list($x, $y, $z, $value) = $row;

        /* This if we had used mysql_fetch_assoc instead
        $x = $row['x'];
        $y = $row['y'];
        $z = $row['z'];
        $value = $row['value'];
        */
        if (!isset($arr3d[$x]))
            $arr3d[$x] = array();
        if (!isset($arr3d[$x][$y]))
            $arr3d[$x][$y] = array();
        $arr3d[$x][$y][$z] = $value;
    }
    mysql_free_result($handle);
?>

如果您想要一个完整(“密集”)数组,您必须首先循环 x、y 和 z 遍历它们的所有值,并为数组单元分配一个默认值,以便被 SQL 循环覆盖。

在上面的代码中,注释了密集补丁,如果没有 x=5, y=2 和 z=3 的行,$arr3d[5][2][3] 将是未定义的。

【讨论】:

  • 如何使用$db = mysql_connect($db_host,$db_user,$db_password) or die($error[0]); 测试您的代码?我也得到Undefined function SQLFetchRow
  • 我已经更新了我的答案;您需要提供数据库连接参数和准确的查询语法才能被接受。
  • 致命错误:在第 44 行 pastebin.com/s9dPiJRX 中调用未定义函数 mysql_free()
  • 啊,对不起。是mysql_free_result()
  • 如何将其更改为回显值(在 while-loop 内),只有当它们实际上在 DB 中时?
【解决方案2】:

mysql_fetch_assoc($pullMapInfo2) 将返回一个数组,您可以使用该数组来获取播放器的 X、Y 和 Z 值,如下所示:

$x = $pullMapInfo3["x"]
$y = $pullMapInfo3["y"]
$z = $pullMapInfo3["z"]

如果你想把它放在你的 result_value 数组中,你可以简单地使用$result_value[$x][$y][$z] = $pullMapInfo3["value"]

另外,将 $result_value 的初始化移出循环到您编写 $result_value = array(); 的位置:

for ($ix = 1; $ix <= 16; $ix++) {
    $result_value[$ix] = array();
    for ($iy = 1; $iy <= 16; $iy++) {
        $result_value[$ix][$iy] = array();
    }
}

然后您可以使用来自 pastebin 的循环。另请注意,您将在输出处获得第 1 层、第 2 层、第 3 层 + 768 &lt;br&gt; 标签,所以我不确定您是否打算这样做。

【讨论】:

  • 这有点滞后并输出Layer 1: pastebin.com/sJJsJrfF
  • 这样做是因为您没有实例化子数组。您只需将$result_value 设置为array(),这意味着它是一维的。 iz 循环中的第一件事:$result_value[$iz]=array(),然后在 ix 循环中:$result_value[$iz][$ix] = array()。请注意,这意味着它的寻址将是 ...[z][x][y]。如果您希望它是 [x][y][z],则必须在使用它们之前编写一个单独的循环来构建数组。它只输出第 1 层,因为它在进入循环后未能进行第一次 $result_value[$x][$y][$z] 查找。
  • 编辑中的新代码显示了如何设置 $result_value。把它放在$result_value = array()之后
  • This (pastebin) 显示第 1 层、第 2 层和第 3 层。我使用了虚拟值。检查您从数据库中获取的 x、y 和 z 是否在适当的范围内。
猜你喜欢
  • 2016-10-04
  • 2012-11-13
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2015-06-11
相关资源
最近更新 更多