php - PHP - 在未定义的数组索引上使用 += 运算符
问题描述
我稍后在我的代码中使用从 SQL 查询中提取的数据来构建两个图表。示例查询类似于:
SELECT purchase_location, purchase_item, SUM(purchase_amount) as totalPurchase
FROM purchases
GROUP BY purchase_item_id, purchase_location
不是一个确切的例子,但想法就在那里。然后我遍历我的结果以构建两个数据集。
$locationData = [];
$itemData = [];
foreach($queryResults as $result) {
$locationData[$result['purchase_location']] += $result['totalPurchase'];
$itemData[$result['purchase_item']] += $result['totalPurchase'];
}
由于我想要来自两个不同观点的数据,我必须使用 += 来获得正确的总数。我的问题是:对数组的未设置索引执行 += 运算符非常慢。我发现如果我执行以下操作:
if (isset($locationData['purchase_location'])) {
$locationData['purchase_location'] += $result['totalPurchase'];
} else {
$locationData['purchase_location'] = $result['totalPurchase'];
}
第一次看到索引时使用 =。这显着加快了代码速度(例如,我的代码从 8-10 秒的运行时间缩短到不到半秒)。我的问题是,这是处理这个问题的正确/最干净的方法吗?
在任何人提到之前,我知道我可以编写查询来在这个简单的情况下处理所有这些,这只是一个非常简单的示例来说明问题,即在尚未定义的数组索引上使用 +=。
解决方案
我建议已经使用该索引初始化数组,避免需要进行 isset 检查并使代码更清晰:
$locationData = ['purchase_location' => 0];
$itemData = ['purchase_item' => 0];
foreach($queryResults as $result) {
$locationData['purchase_location'] += $result['totalPurchase'];
$itemData['purchase_item'] = $result['totalPurchase'];
}
对于我的项目,我通常尝试将 isset 的使用限制为验证从我无法完全控制的外部来源(例如:GET、POST)接收到的数据。
isset
既然你已经更新了你的答案,现在在这种情况下使用它来避免另一个循环来构造数组是有意义的。
$locationData = [];
$itemData = [];
foreach($queryResults as $result) {
if (!isset($locationData[$result['purchase_location']])) {
$locationData[$result['purchase_location']] = 0;
}
if (!isset($itemData[$result['purchase_item']])) {
$itemData[$result['purchase_item']] = 0;
}
$locationData[$result['purchase_location']] += $result['totalPurchase'];
$itemData[$result['purchase_item']] += $result['totalPurchase'];
}
如果您使用的是 PHP 7+,则可以使用null 合并 ??
来简化代码,如下所示:
$locationData = [];
$itemData = [];
foreach($queryResults as $result) {
$locationData[$result['purchase_location']] = $result['totalPurchase'] + ($locationData[$result['purchase_location']] ?? 0);
$itemData[$result['purchase_item']] = $result['totalPurchase'] + ($itemData[$result['purchase_item']] ?? 0);
}
推荐阅读
- replace - 如何通过cmd用jrepl替换+附加?
- extjs - 如何在 extjs 6 中创建具有级别的可访问标题?
- r - 将行分成不同的列并在 R 中连接它们
- android - 当我运行下面的代码时,我收到了适配器错误,我尝试通过查看 yt 视频来解决它....仍然无法正常工作
- azure-devops-migration-tools - 测试用例/套件/计划迁移后,所有测试用例都显示为“活动” - 与源状态不匹配
- google-cloud-platform - 谷歌云物联网核心上传图片
- linux - “tee”允许我们重定向命令的输出 - 是否有任何简单的方法来输出正在运行的命令字符串?
- r - 在 R(环境)中保存(回归)模型时避免更大(臃肿)的大小
- python - 如何使用 python skpy 自动更改 Skype 配置文件名称和图片
- php - 如何在 PHP 中将图像全景到立方体