3

由于我之前的问题简化了,我正在尝试在 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];
}
}
}
4

2 回答 2

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

填充阶段只是简单地选择至少xy和字段。zvalue

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

<?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] 将未定义。

于 2012-09-13T11:41:58.577 回答
0

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 中的循环。另请注意,您将在输出 + 768 个<br>标签处获得第 1 层、第 2 层、第 3 层,所以我不确定这是否是您的意思。

于 2012-09-13T11:38:37.963 回答