使用二维阵列有什么优势?

时间:2018-12-03 11:29:43

标签: php arrays multidimensional-array

在过去的几个月中,我一直在使用PHP编写游戏的主手册,其中之一包括某个组使用的所有载具的表格以及其统计信息和限制。在使用数组时,我已经走到了一个交集,尽管两者都可以正常工作,但我想知道使用2d数组而不是单独数组的实际优势。

例如,我可以使用单个变量并调用主数组(车辆):

$facVehImage[0] = 'lcpd.png';
$facVehName[0] = 'LCPD Cruiser';
$facVehDesc[0] = 'Used by the LCPD.';
$facVehRank[0] = 'Officer';
$facVehDiv[0] = 'None';

$facVehImage[1] = 'vcpd.png';
$facVehName[1] = 'VCPD Cruiser';
$facVehDesc[1] = 'Used by the VCPD.';
$facVehRank[1] = 'Officer';
$facVehDiv[1] = 'None';

这些变量将根据我的包含行在HTML中构建一个单独的表行。现在,我可以这样做...但是我也设法将其与以下对象一起使用:

$facVeh[0][0] = 'lcpd.png';
$facVeh[0][1] = 'LCPD Cruiser';
$facVeh[0][2] = 'Used by the LCPD.';
$facVeh[0][3] = 'Officer';
$facVeh[0][4] = 'None';

$facVeh[1][0] = 'vcpd.png';
$facVeh[1][1] = 'VCPD Cruiser';
$facVeh[1][2] = 'Used by the VCPD.';
$facVeh[1][3] = 'Officer';
$facVeh[1][4] = 'None';

当然,使用2d数组将意味着我需要在输出文件中的某个位置添加一个增量以使其正常工作,但除此之外,真正的区别是什么?


为了澄清,我可能这样做效率很低。数据通过单独的脚本馈送,并从包含所有必需变量(包括数组)的PHP文件构建PHP文件,该文件最终包括HTML文件。 HTML文件(在“车辆”部分)看起来有点像这样(为乱七八糟致歉):

<div class="fpVehicles">
    <span class="header">Vehicles</span>
    <table class="fpVehicleTable">
    <?php
        $facVehCount = 0;
        while ($facVehCount < $facVehLimit) {
            echo '<tr valign="top"><td class="fpVehicleImage"><img src="img/v/'.$facVehImage[$facVehCount].'" class="cVeh"></td>';
            echo '<td valign="top" class="fpVehInfoBox"><div class="fpVehInfoTitle">'.$facVehName[$facVehCount].'</div>';
            echo '<div class="fpVehInfoDesc">'.$facVehDesc[$facVehCount].'</div>';
            echo '<div class="fpVehInfoRank"><b>Rank:</b> '.$facVehRank[$facVehCount].'+</div>';
            echo '<div class="fpVehInfoDiv"><b>Division:</b> '.$facVehDiv[$facVehCount].'</div></td></tr>';
            $facVehCount++;
        }
    ?>
    </table>
</div>

我测试2d数组时存在单独的回声线,因此需要在它们之间增加。我知道我可以使用多行回声(<<<)并将其扔进去,但是为了尽快更改它,我认为这是浪费清洁工作。

3 个答案:

答案 0 :(得分:6)

这是为了使您的代码有意义,更有条理,更具可读性。

您的方法#1

在第一个示例中,您要制作五个单独的变量,它们应该相互关联。要获得第一辆车的属性,您需要获得:

$facVehImage[0]
$facVehName[0]
$facVehDesc[0]
$facVehRank[0]
$facVehDiv[0]

您到处乱扔了多个应该与一个对象相关的单独变量。

您的方法2

使用第二种方法更轻松,更清洁,在第二种方法中,您只需要获得以下车辆的属性即可:

$facVeh[0]

其中包含您需要了解的有关车辆的所有信息。但是,这仍然是错误的代码。

没有人想记住$facVeh[0][3]的含义。 [3]是什么属性?如果您忘记了,是否要稍后再检查代码以找出答案?如果其他人需要使用您的代码怎么办?他们怎么知道?如果以后再向阵列添加新属性该怎么办?顺序改变了,突然[3]不再是排名。一切都中断了,您需要更改所有代码。


替代方法(#3)

一种更好的方法是使用关联数组,该数组将车辆的所有属性都保留在一个位置,但可以正确地标记它们。这样可以避免上述问题。

$facVeh = [
    'lcpd' => [
        'name'  => 'LCPD Cruiser',
        'desc'  => 'Used by the LCPD.',
        'image' => 'lcpd.png',
        'rank'  => 'Officer',
        'div'   => 'None'
    ],
    'vcpd' => [
        'name'  => 'VCPD Cruiser',
        'desc'  => 'Used by the VCPD.',
        'image' => 'vcpd.png',
        'rank'  => 'Officer',
        'div'   => 'None'
    ]
];

现在,当您编写$facVeh['lcpd']['rank']时,它就很有意义了-比$facVeh[0][3]更有意义。您还可以将车辆很好地包含在一个变量中。


最佳方法(#4)

您真正想要做的是使用面向对象的代码。这是一个很大的话题,不在此答案的范围内,但是您将拥有一个Vehicle类并为其构建多个实例。

基本示例:

class FacVehicle
{

    public $name;
    public $desc;
    public $rank;
    public $image;
    public $div;

    public function __construct($name, $desc)
    {
        $this->name = $name;
        $this->desc = $desc;
    }
}

$lcpdVehicle = new FacVehicle('LCPD Cruiser', 'Used by the LCPD.');
$lcpdVehicle->rank = new OfficerRank();
$lcpdVehicle->image = 'lcpd.png';

HTML清理

关于清理HTML输出的一些建议,这也显示了使用更多语义代码的好处:

<div class="fpVehicles">
    <span class="header">Vehicles</span>
    <table class="fpVehicleTable">
        <?php foreach ($facVehicles as $i => $vehicle) : ?>

        <tr valign="top">
            <td class="fpVehicleImage"><img src="img/v/<?= $vehicle['image']; ?>" class="cVeh"></td>
            <td valign="top" class="fpVehInfoBox">
                <div class="fpVehInfoTitle"><?= $vehicle['name']; ?></div>
                <div class="fpVehInfoDesc"><?= $vehicle['description']; ?></div>';
                <div class="fpVehInfoRank"><b>Rank:</b> <?= $vehicle['rank']; ?>+</div>';
                <div class="fpVehInfoDiv"><b>Division:</b> <?= $vehicle['div']; ?></div>
            </td>
        </tr>

        <?php endforeach; ?>
    </table>
</div>

答案 1 :(得分:0)

这主要是关于样式/体系结构。如果您有硬编码的数据,那么在这种情况下使用2个数组就可以了;主要区别是使用多个变量而不是1。

假设您有以下数组;

$facVehImage[0] = 'lcpd.png';
$facVehName[0] = 'LCPD Cruiser';

然后您需要在该数组中显示数据,如:

foreach ($facVehImage as $image) {
  echo $image; // or something like that
}

foreach ($facVehName as $name) {
  echo $name; // or something like that
}

现在您正在运行2个循环,最好有1个循环,所以您最终会做类似的事情;

for ($i = 0; $i < count($facVehImage); $i++) {
  echo $facVehName[$i] . $facVehImage[$i];
}

问题是当2个数组的长度不同时(例如,您有5张图像,但只有4个名称),PHP将输出错误/通知,表明找不到索引。

使用1个多维数组更好,因为它允许您使用关联(字典)数组;

$vehicles[] = ['name'=>'foo', 'image'=>'bar'];
$vehicles[] = ['name'=>'faz', 'image'=>'baz'];

将其输出到表中时,您的代码将变得更整洁,更易读;

foreach ($vehicles as $vehicle) {
  echo $vehicle['name'];
  echo $vehicle['image'];
}

答案 2 :(得分:0)

使用multidimensional2d数组,可以轻松访问和维护。

您不必为每个实体使用各种变量,这些变量可以驻留在整个应用程序的单个变量中。

创建的每个变量都占用一个特定的资源,在访问该资源时必须对其进行查找。在这里创建一个2d数组是有益的。

根据您的情况创建2d数组的更好方法是使用String作为键。

$facVeh[0]['VehImage'] = 'lcpd.png';
$facVeh[0]['VehName'] = 'LCPD Cruiser';
$facVeh[0]['VehDesc'] = 'Used by the LCPD.';
$facVeh[0]['VehRank'] = 'Officer';
$facVeh[0]['VehDiv'] = 'None';

$facVeh[1]['VehImage'] = 'vcpd.png';
$facVeh[1]['VehName'] = 'VCPD Cruiser';
$facVeh[1]['VehDesc'] = 'Used by the VCPD.';
$facVeh[1]['VehRank'] = 'Officer';
$facVeh[1]['VehDiv'] = 'None';

请注意,请勿手动分配数字索引012等。创建一个循环来创建它。