【问题标题】:PHP - unset object in nested foreach loopsPHP - 嵌套 foreach 循环中的未设置对象
【发布时间】:2012-05-02 01:11:59
【问题描述】:

长话短说 - 尝试在第一个 foreach 中取消设置 $this->models[$modelKey] 时取消设置效果很好,$this->models[$modelKey]->equipmentList->equipment[$eqKey] 指向正确的对象,但在嵌套的 foreach 中取消设置它不起作用。有任何想法吗?提前感谢您的帮助。

public function processModelsEquipmentList() {
    foreach ($this->models as $modelKey => $model) {
      if (!strstr('#', $model->id)) {
        foreach ($model->equipmentList->equipment as $eqKey => $equipment) {
          if (in_array($equipment->code, $this->specialVersionsCodes)) {
            $newModel = clone $model;   
            $newModel->name.= ' ' . $equipment->name;
            $newModel->id.= '#' . $equipment->id;
            if (strlen($newModel->code) < 4) {
              $newModel->code.=$equipment->code;
            }
            $newModel->order = $newModel->order + 1;
            $newEquipmentList = new EquipmentList($newModel->id, true);
            $newEquipmentList->add(clone $equipment);
            $newModel->setNewEquipmentList($newEquipmentList);
            $this->addModel($newModel);
            //echo $this->models[$modelKey]->equipmentList->equipment[$eqKey]->name;die();
            unset($this->models[$modelKey]->equipmentList->equipment[$eqKey]);
          }
        }
      }
    }
  }

【问题讨论】:

    标签: php arrays oop foreach unset


    【解决方案1】:

    它不是通过 $model 而不是 $this->models 访问的吗?和 $equipment 一样。

    试试这个:

    unset($equipment[$eqKey]); 
    

    一些扩展:

    foreach ($this->models as $modelKey => $model) {
        //here you use $model to access $this->models[X]
        foreach ($model->equipmentList->equipment as $eqKey => $equipment) { 
            //here you use $equipment to access $this->models[X]->equipmentList->equipment[x]
        } 
    } 
    

    编辑:

    现在我得到了解决方案:

    foreach ($this->models as $modelKey => $model) {
        foreach ($model->equipmentList->equipment as $eqKey => $equipment) {
            //use the $modelKey key and not the $eqKey
            unset($model->equipmentList->equipment[$modelKey]);
        } 
    } 
    

    【讨论】:

    • 试过:unset($equipment);, unset($model->equipmentList->equipment[$eqKey]); - 两种解决方案都不起作用($equipment 是一个对象,所以 $equipment[$eqKey] 不准确)。同样使用对这些对象的引用 - 在这样做时不会改变任何事情:foreach ($model->equipmentList->equipment as $eqKey => &$equipment),在 foreach ($ this->models as $modelKey => &$model)
    • 您要取消设置对象还是对象的属性?
    • 我正在尝试取消设置对象(保存在数组中)。澄清一下:$this->models - 数组,$model->equipmentList - 对象,$model->equipmentList->equipment - 对象数组
    • 您在第一条评论中写道您尝试了 unset($equipment); (对象数组)但不是 unset($equipment[$eqKey]); (对象)
    • foreach ($model->equipmentList->equipment as $eqKey => $equipment) - $equipment 是一个对象,$model->equipmentList->equipment 是一个数组。我的名字不好。 :P
    【解决方案2】:

    如果我发现了,我会把这个作为答案,但如果我错了,我会把它移到评论中:

    首先,您在最后克隆您尝试取消设置的对象。为什么不在克隆后立即取消设置?

    其次,我认为该对象是通过设计通过引用传递给foreach循环的,因此您不需要引用键。

    如果我是对的,这可能有效:

    public function processModelsEquipmentList() {
        foreach ($this->models as $modelKey => $model) {
          if (!strstr('#', $model->id)) {
            foreach ($model->equipmentList->equipment as $eqKey => $equipment) {
              if (in_array($equipment->code, $this->specialVersionsCodes)) {
                $newModel = clone $model;
                unset($model);  // <-- Unesetting after clone, using loop var name.
                $newModel->name.= ' ' . $equipment->name;
                $newModel->id.= '#' . $equipment->id;
                if (strlen($newModel->code) < 4) {
                  $newModel->code.=$equipment->code;
                }
                $newModel->order = $newModel->order + 1;
                $newEquipmentList = new EquipmentList($newModel->id, true);
                $newEquipmentList->add(clone $equipment);
                $newModel->setNewEquipmentList($newEquipmentList);
                $this->addModel($newModel);
              }
            }
          }
        }
      }
    

    【讨论】:

    • 1.我正在尝试取消设置 $equipment,而不是 $model。 2. 关于引用的想法来自这里(stackoverflow.com/questions/2304570/…)。他们说如果想以这种方式取消设置,我需要使用它。 3.在$newEquipmentList->add(clone $equipment)之后移动unset;没有改变任何东西。编辑:粘贴错误的链接。现在是正确的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2015-07-06
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    相关资源
    最近更新 更多