【问题标题】:How to add index to foreach data from database?如何为数据库中的foreach数据添加索引?
【发布时间】: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,也就是说,如果在循环执行后变量未设置。我不建议在这个阶段去那里。在我看来,原始发帖人使用键更安全,并且在他完全理解循环和数组之前不用担心变量范围的这一方面。

标签: php mysql codeigniter foreach


【解决方案1】:

让我们剖析一下:

  1. $insuranceType_list 是一个对象数组。我知道这一点是因为您正在使用$l->something 中的箭头访问值,如果您有一个数组数组,您将像这样访问它$l['something']
  2. 前面的@ 只是表示您正在抑制该变量的错误。它通常用于您不想抛出错误的函数中。
  3. 您可以使用不带$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。谢谢兄弟!快乐编码!干杯。
猜你喜欢
  • 2016-12-29
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2013-03-24
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多