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

$ this->modelsではなく$modelを介してアクセスされませんか?そして$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 に答える