如何为数据库中的foreach数据添加索引?
Posted
技术标签:
【中文标题】如何为数据库中的foreach数据添加索引?【英文标题】:How to add index to foreach data from database? 【发布时间】:2017-10-19 00:43:35 【问题描述】:在下面的代码中,我了解到foreach
$insuranceType_list
正在将数据行分配给$l
。 $k
是干什么用的?对于index
?
而@
前面的任何变量都可以使变量成为全局变量吗?这意味着我可以在整个应用程序的任何地方访问它?
if(@$insuranceType_list)
foreach($insuranceType_list as $k=>$l)
$insuranceType_list[$k]->version_list = $this->mdl_quotation_template->getConditionTemplates('insurance_type_id='.$l->id);
我也不明白这里发生了什么:
$insuranceType_list[$k]->version_list
如果有人可以解释我会很有帮助。
【问题讨论】:
@
用于error reporting。 $k
是关联数组的 key。在提交问题之前,您是否尝试过manual 或进行过任何搜索?
@Pyromonk 抱歉,我确实尝试过搜索..我很困惑...$k 是关联数组的键。就像它根据 1.$l , 2.$l 等等来分配键......对吧?
如果使用foreach,则不需要调用$insuranceType_list[$k]
,尝试改为$l
在您的示例中,$insuranceType_list
是一个关联数组,foreach
遍历其每个键 ($k
) 并将所述键处的值分配给临时变量 $l
。所以如果你有$insuranceType_list = array('foo' => 'bar', 'bar' => 'foo');
,foreach
循环将经历 2 次迭代($k
等于 'foo' 和 $l
等于 'bar' 在第一个和 $k
等于 'bar' 和 @ 987654345@ 等于第二个中的 'foo')。有关更多示例,请参阅foreach
上的手册条目。
@Ukasyah,也就是说,如果在循环执行后变量未设置。我不建议在这个阶段去那里。在我看来,原始发帖人使用键更安全,并且在他完全理解循环和数组之前不用担心变量范围的这一方面。
【参考方案1】:
让我们剖析一下:
$insuranceType_list
是一个对象数组。我知道这一点是因为您正在使用$l->something
中的箭头访问值,如果您有一个数组数组,您将像这样访问它$l['something']
前面的@
只是表示您正在抑制该变量的错误。它通常用于您不想抛出错误的函数中。
您可以使用不带$k
的foreach 进行迭代,例如foreach($insuranceType_list as $l)
,这意味着您不关心索引,您只需要每次迭代的值。但是,如果您出于任何原因打算使用该密钥,那么您可以像当前一样使用该 $k
变量。
示例: 假设你有一个数组是这样的:
$list = [
[
'name' => 'john'
'age' => 29
],
[
'name' => 'jane'
'age' => 23
]
];
如果您想创建表示 “John is 29 岁”的字符串。然后您将执行以下操作:
foreach($list as $l)
echo "$l['name'] is $l['age'] years old";
但是,如果您希望字符串显示 “John 在列表中排名第一,并且是 29 岁”。然后您将执行以下操作:
foreach($list as $k => $l)
echo "$l['name'] is #$k on the list, and is $l['age'] years old";
话虽如此,我会以这种方式缩短您的代码:
if (!empty($insuranceType_list))
foreach ($insuranceType_list as $l)
$l->version_list = $this->mdl_quotation_template->getConditionTemplates('insurance_type_id=' . $l->id);
【讨论】:
感谢@CodeGodie 的详细解释。所以总的来说 $insuranceType_list[$k]->version_list 意味着我将 version_list 添加到我的每个 $insuranceType_list 对吗? 不客气。是的,当使用对象(-> 表示法)时,您可以像在$l->version_list = ...
中所做的那样通过在迭代中分配它们来轻松添加额外的值,这意味着如果该对象具有名为 version_list
的属性,它将重新分配,但是如果它不存在,它将创建它。希望这是有道理的。
谢谢!这就是让我感到困惑的原因。我一直在使用这种格式 foreach ($lists as $k=>$list),如果我想添加任何我们可以像你上面提到的 $list->version_list 那样做的事情。非常感谢!
没问题。请记住,这仅适用于对象。如果您有一个数组数组,则需要通过引用传递它,这完全是另一个怪物。最好使用对象。
哦!我会注意到这一点:D。谢谢兄弟!快乐编码!干杯。以上是关于如何为数据库中的foreach数据添加索引?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 CitusDB 的 cstore_fdw 添加索引?
如何为 ForEach 中的每张卡片添加导航链接,以便它们有自己的屏幕可以访问?