我相信,当您使用旨在作为一个集合保存的数据时,最好将其存储在单个数据集中(例如关联数组或对象)。以下是可用于存储数据集的结构示例。
在 PHP 中,作为关联数组:
$owner = array(
'year' => 2012, 'month' => 'July', 'measure' => 3
);
在 C# 中,作为哈希表:
Hashtable owner = new Hashtable();
owner.Add("year", 2012);
owner.Add("month", "July");
owner.Add("measure", 3);
在 Java 中,作为哈希表:
Hashtable owner = new Hashtable();
owner.put("year", new Integer(2012));
owner.put("month", new String("July"));
owner.put("measure", new Integer(3));
在 C#/Java 中,作为对象:
public class Owner {
public int year;
public string month;
public int measure;
}
Owner o = new Owner();
o.year = 2012;
o.month = "July";
o.measure = 3;
在 C# 和 Java 中,使用对象而不是哈希表的优点是可以为每个字段/变量声明变量类型(即 int 或 string),这将有助于防止错误并保持数据完整性,因为会抛出错误(或当您尝试将错误类型的数据分配给字段时,将生成警告。
在 PHP 中,我发现在存储数据集合时对象与数组相比没有真正的优势,因为类型提示不允许使用标量变量,这意味着需要额外的代码来检查/限制在属性中输入的数据,你有要编写额外的代码来声明类,您可能会通过拼写错误的名称意外地将值分配给错误的属性(与数组相同,因此对数据完整性没有帮助),以及属性的迭代/操作还需要额外的代码。我还发现在 PHP 中转换为 JSON 时使用关联数组更容易。
根据问题中的代码,当您需要通过其中一个字段或其他一些条件(例如字段的组合或字段将映射到)。
这是哈希表和关联数组对每种语言更有用的地方。例如,如果您想根据年份和月份将所有者组织成组,您可以创建关联数组(或哈希表)来执行此操作。
以下 PHP 示例使用PDO 和 fetchAll从数据库中获取信息:
$sth = $dbh->prepare("SELECT year, month, measure FROM owners");
$sth->execute();
$rows = $sth->fetchAll(PDO::FETCH_ASSOC);
$data = array();
foreach ($rows as $row) {
$year = $row['year'];
$month = $row['month'];
if (!isset($data[$year])) {
$data[$year] = array();
}
if (!isset($data[$year][$month])) {
$data[$year][$month] = array();
}
array_push($data[$year][$month], $row);
}
该数据可能看起来像代码的一个示例是:
$data = array(
2011 => array(
'July' => array(
array('year' => 2011, 'month' => 'July', 'measure' => 1),
array('year' => 2011, 'month' => 'July', 'measure' => 3)
),
'May' => array(
array('year' => 2011, 'month' => 'May', 'measure' => 9),
array('year' => 2011, 'month' => 'May', 'measure' => 4),
array('year' => 2011, 'month' => 'May', 'measure' => 2)
)
),
2012 => array(
'April' => array(
array('year' => 2012, 'month' => 'April', 'measure' => 7)
)
)
);
然后,您可以使用密钥访问数据。
$data[2011]['July'];
// array(
// array('year' => 2011, 'month' => 'July', 'measure' => 1),
// array('year' => 2011, 'month' => 'July', 'measure' => 3)
// )
此外,当我创建代表数据集合的对象时,我会尽量保持它们的最小化。如果您将集合存储在对象中,当您开始添加对集合执行操作的函数时,将需要维护更多代码。有时这是必要的,例如,如果您需要限制可以通过setter存储的值,但是如果您所做的只是将数据从用户传递到数据库并再次在屏幕上显示,那么通常不需要数据收集中的高级功能,拥有该功能可能更有意义在别处管理。例如,View 类可以处理显示数据,Model 类可以处理提取数据,Check 对象可以验证是否可以保存数据或验证是否可以根据集合中的数据执行操作。