最佳实践:如何构建阵列 - 标准和命名约定

Flu*_*feh 13 php arrays naming-conventions

根据哪些元素包含迭代器与细节元素,多维数组结构中的最佳实践是什么?

我的大部分编程经验(我主要是为了好玩而做)来自谷歌的以下教程,所以如果这似乎是一个特别愚蠢的问题,我提前道歉 - 但我确实想开始改进我的代码.

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

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

$myArray['year']=2012;
$myArray['month']='July';
$myArray['measure']=3;
// and so on.
Run Code Online (Sandbox Code Playgroud)

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

$myArray[$owner]['year']=2012;
$myArray[$owner]['month']='July';
$myArray[$owner]['measure']=3;
Run Code Online (Sandbox Code Playgroud)

编辑:为了确保我的示例不是正确的方向或引导,我基本上遵循这个结构:

$myArray[rowOfData][columnOfData]
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是关于公认的惯例.我应该做以下吗?

$myArray['year'][$owner]=2012;
$myArray['month'][$owner]='July';
$myArray['measure'][$owner]=3;
Run Code Online (Sandbox Code Playgroud)

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

$myArray[columnOfData][rowOfData]
Run Code Online (Sandbox Code Playgroud)

我已经搜索过有关数组命名约定的内容,但是仍在讨论是否将数组命名为复数的文章.我一直在命名它们的方式似乎更合乎逻辑,我认为它遵循一个更好地类似于一个对象的结构,object->secondaryLevel->detail但是据我所知,我一直都在做这个问题.随着我越来越多地参与编程,如果他们错了,我宁愿改变我的习惯.

是否有可接受的标准,或者只是阵列的任何内容?如果您正在查看其他人编写的代码,那么期望的格式是什么?我知道任何有意义/直观的结构都是可以接受的.

从迭代的角度来看,以下哪一项更直观?:

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

编辑:我确实把这篇文章标记为c#和Java,因为我想在PHP程序员之外得到一些意见.我认为,由于数组被用于许多不同的语言,所以从各种语言的程序员那里得到一些输入会很好.

Mik*_*ell 21

你的问题是主观的,因为每个人对你所陈述的情况都有不同的看法,你甚至可以提出问题; 如何最好地命名您的变量,类等等.不幸的是,我花费的时间比我更愿意承认确定最有意义且满足要求的变量名称.我的最终目标是编写" 自我记录 "的代码.通过编写自我记录代码,您会发现添加功能或修复缺陷会更容易.

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

数组:总是复数

我这样做,所以循环控制结构更具语义感,并且更容易使用.

// 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);
Run Code Online (Sandbox Code Playgroud)

对象数组>深度多维数组

在你的例子中,你的数组开始被炸成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;
}
Run Code Online (Sandbox Code Playgroud)

现在,您只需迭代一个平面阵列即可访问所需的数据:

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

这个对象数组方法的一个很酷的事情是添加增强功能是多么容易,如果你想添加一个所有者名称怎么办?没问题,只需将成员变量添加到您的类中并稍微修改您的水合作用:

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));
}
Run Code Online (Sandbox Code Playgroud)

你必须记住,上面的代码片段只是建议,如果你坚持使用深度多维数组,那么你必须找出一个对和你合作的人有意义的元素排序安排,如果你认为你六个月后设置会遇到问题,那么最好在有机会的时候实施更好的策略.