1 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';
Run Code Online (Sandbox Code Playgroud)
变量将根据我的include行在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';
Run Code Online (Sandbox Code Playgroud)
当然使用2d数组意味着我需要在输出文件中的某处添加一个增量才能正常工作但除此之外真的有什么区别?
为了澄清,我可能会以非常低效的方式完成这项工作.数据通过单独的脚本提供,并构建一个包含所有必需变量(包括数组)的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>
Run Code Online (Sandbox Code Playgroud)
单独的回波线存在于我测试2d阵列时,因此需要在中间增加.我知道我可以使用多线回声(<<<)然后把它扔到那里但是为了不久它被改变,我认为这是浪费清洁.
它是关于保持代码有意义,更有条理,更可读.
你的方法#1
在第一个例子中,你要制作五个独立的变量,它们都应该相互关联.要获得第一辆车的属性,您需要获得:
$facVehImage[0]
$facVehName[0]
$facVehDesc[0]
$facVehRank[0]
$facVehDiv[0]
Run Code Online (Sandbox Code Playgroud)
你在乱扔垃圾的地方有多个独立的变量,这些变量都应该与一个对象有关.
你的方法#2
使用第二种方法更容易,更清洁,在哪里获得您只需获得的车辆属性:
$facVeh[0]
Run Code Online (Sandbox Code Playgroud)
包含在您需要知道的关于车辆的一切.但是,这仍然是错误的代码.
没人想要记住是什么$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'
]
];
Run Code Online (Sandbox Code Playgroud)
现在,当你写$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';
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)