如何从MySQL填充PHP 3D数组

时间:2012-09-13 11:30:41

标签: php mysql arrays multidimensional-array

由于我之前的问题简化,我正在尝试用PHP学习3D数组,但每一课都让我难以理解。

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

  1. 使用MySQL数据库中的数据填充
  2. 显示它/ reffer,如:echo $result_value[x][y][z]给出 value
  3. 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];
    }
    }
    }
    

2 个答案:

答案 0 :(得分: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]将是未定义的。

答案 1 :(得分: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层,因此我不确定这是否是您的意图。