如何为数据库中的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数据添加索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 MySQL 表添加索引?

如何为 CitusDB 的 cstore_fdw 添加索引?

如何为 ForEach 中的每张卡片添加导航链接,以便它们有自己的屏幕可以访问?

如何为mysql中的现有表创建索引?

如何为mysql中的数据记录添加一个唯一的编号,在查询的时候可以根据这个编号对这条记录进行操作。

如何为codeigniter中的特定列数据赋予颜色?