1

长话短说 - 尝试$this->models[$modelKey]在第一个 foreach 中取消设置时,取消设置工作正常,$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]);
          }
        }
      }
    }
  }
4

2 回答 2

0

它不是通过 $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]);
    } 
} 
于 2012-04-20T12:43:52.490 回答
0

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

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

其次,我认为对象是按设计通过引用传递给 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);
          }
        }
      }
    }
  }
于 2012-04-20T12:56:00.697 回答