php - 最佳实践 : How to Structure Arrays - Standards and Naming Conventions

标签 php arrays naming-conventions

<分区>

就哪些元素持有迭代器与哪些细节元素而言,多维数组结构中的最佳实践是什么?

我的大部分编程经验(我这样做主要是为了好玩)来自于谷歌上的教程,所以如果这看起来是一个非常愚蠢的问题,我提前道歉 - 但我确实想开始改进我的代码。

每当我需要创建一个多维数组时,我的命名总是将计数器放在第一个元素中。

例如,如果我有一个一维数组如下:

$myArray['year']=2012;
$myArray['month']='July';
$myArray['measure']=3;
// and so on.

但是,如果我想让同一个数组保留一些历史所有者,我会添加另一个维度并将其格式化如下:

$myArray[$owner]['year']=2012;
$myArray[$owner]['month']='July';
$myArray[$owner]['measure']=3;

编辑:为确保我的示例不会令人反感或引导正确的方向,我基本上遵循以下结构:

$myArray[rowOfData][columnOfData]

现在,我的问题是关于公认的惯例。我应该改为执行以下操作吗?

$myArray['year'][$owner]=2012;
$myArray['month'][$owner]='July';
$myArray['measure'][$owner]=3;

编辑:使用上面的编辑,应该是:

$myArray[columnOfData][rowOfData]

我已经搜索过关于数组命名约定的内容,但一直有文章争论是否将数组命名为复数形式。我命名它们的方式似乎更合乎逻辑,我认为它遵循更类似于对象的结构,即 object->secondaryLevel->detail 但据我所知,我一直在这样做- 一直以来。随着我越来越喜欢编程,如果我的习惯是错误的,我宁愿改变它们。

是否有一个公认的标准,或者它是否与数组有关?如果您正在查看其他人编写的代码,您期望的格式是什么?我知道任何有意义/直观的结构都是可以接受的。

同样从迭代的角度来看,下面哪个更直观?:

for($i=0;$i<$someNumber;$i++)
{
    echo $myArray[$i]['year'];
    // OR
    echo $myArray['year'][$owner];
}

编辑:我确实将这篇文章标记为 c# 和 Java,因为我想获得 PHP 程序员之外的一些意见。我认为,由于数组在如此多的不同语言中使用,因此从各种语言的程序员那里获得一些输入会很好。

最佳答案

你的问题是主观的,因为每个人对你所说的情况可能有不同的看法,你问这个问题是明智的;如何最好地命名你的变量、类等。遗憾的是,我花了比我愿意承认的更多的时间来确定有意义并满足要求的最佳变量名称。我的最终目标是编写代码 ' self documenting '。通过编写自记录代码,您会发现添加功能或修复出现的缺陷要容易得多。

多年来,我发现这些做法最适合我:

数组:总是复数

我这样做是为了使循环控制结构具有更多的语义意义,并​​且更易于使用。

// With a plural array it's easy to access a single element
foreach ($students as $student) {}

// Makes more sense semantically
do {} (while (count($students) > 0);

对象数组 > 深度多维数组

在您的示例中,您的数组开始膨胀为 3 元素深的多维数组,并且与 Robbie 的代码片段一样正确,它展示了迭代多维数组所需的复杂性。相反,我建议创建可以添加到数组中的对象。请注意,以下代码只是演示性的,我总是使用访问器。

class Owner
{
    public $year;
    public $measure;
    public $month;
}

// Demonstrative hydration 
for ($i = 1 ; $i <= 3 ; $i++) {

    $owner = new Owner();

    $owner->year = 2012;
    $owner->measure = $i;
    $owner->month = rand(1,12);

    $owners[] = $owner;
}

现在,您只需遍历平面数组即可访问所需的数据:

foreach ($owners as $owner) {
    var_dump(sprintf('%d.%d: %d', $owner->month, $owner->year, $owner->measure));
}

这种对象数组方法的妙处在于添加增强功能非常容易,如果您想添加所有者名称怎么办?没问题,只需将成员变量添加到您的类中并稍微修改您的水合作用:

class Owner
{
    public $year;
    public $measure;
    public $month;
    public $name;
}

$names = array('Lars', 'James', 'Kirk', 'Robert');

// Demonstrative hydration 
for ($i = 1 ; $i <= 3 ; $i++) {

    $owner = new Owner();

    $owner->year = 2012;
    $owner->measure = $i;
    $owner->month = rand(1,12);
    $owner->name = array_rand($names);

    $owners[] = $owner;
}

foreach ($owners as $owner) {
    var_dump(sprintf('%s: %d.%d: %d', $owner->name, $owner->month, $owner->year, $owner->measure));
}

你必须记住,上面的代码片段只是建议,如果你更愿意坚持使用深度多维数组,那么你将不得不找出一种对有意义的元素排序安排以及那些与你共事的人,如果你认为你会在六个月后的设置中遇到麻烦,那么最好在有机会的时候实现更好的策略。

关于php - 最佳实践 : How to Structure Arrays - Standards and Naming Conventions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11532598/

相关文章:

javascript - "Unlink"数据库回显结果

php - Laravel Nova 自定义字段类未找到错误

php - symfony2 Doctrine 在不创建完整结果数组的情况下获取

javascript - 全局变量表示未定义 - js

c# - ValueTuple 命名约定

naming-conventions - 为什么习惯用 'handler' 后缀事件处理程序?为什么不用 'handle' 前缀呢?

php - JQuery 隐藏/可见错误

php - 获取Mysql中 "or"语句的最后一行

传递给 execvp(2) 的 c 字符串操作

Mysql 数据库列命名将减少 Sequelize ORM 工具的问题