0

我有以下代码。我试图让它更简单更短。我创建了$data1数组并添加了相关数据array_merge并将其保存到我的模型中。但请注意,$data1里面$exists有相同的代码。是否可以在$data1不重写相同代码的情况下将数组传递给 MyModel 的 find 方法?

因为我需要在这些片段中创建多行,所以我使用了MyModel->create. 在这段代码中,我粘贴了两个块,但最初我有 6 个这样的块。所以缩短对我来说很重要。

总结:我需要缩短这个代码片段,我不想在每个块中重写相同的数据。

        $usersNew=array("mike", "john");
        $usersLost=array("anna", "maria");

        $data1 = array('userid' => $userid,
            'date' =>  date('Y-m-d')
        );

        foreach ($usersNew as $f) {
            $data2 = array_merge($data1, array("users_new" => $f));
            $exists=$this->MyModel->find('first',
                array('conditions' => array(
                    'MyModel.userid' => $userid,
                    'MyModel.date' => date('Y-m-d'),
                    'MyModel.users_new' => $f
                ) ));

            if ($exists == FALSE) {
                $this->MyModel->create();
                $this->MyModel->save($data2);
            }
        }

        foreach ($usersLost as $f) {
            $data2 = array_merge($data1, array("users_lost" => $f));
            $exists=$this->MyModel->find('first',
                array('conditions' => array(
                    'MyModel.userid' => $userid,
                    'MyModel.date' => date('Y-m-d'),
                    'MyModel.users_lost' => $f
                ) ));

            if ($exists == FALSE) {
                $this->MyModel->create();
                $this->MyModel->save($data2);
            }
        }
4

1 回答 1

1

对于代码的优化,也许这不是最好的提问地方。SO 还有其他“兄弟姐妹”,例如Code Review。我只是建议这样做,因为也许您会在那里找到更好或更专门的答案。

但是,说到手头。在这种情况下,我通常会做一个像这样的额外数组

$helper = array('usersNew'=>'users_new',
                'usersLost'=>'users_lost',
                /* name of array you want to loop => name of column in db */ );

这就像拥有一个包含代码可变部分的数组。我正在使用您的确切代码,但如果您将来需要更复杂的东西,多维数组会更好。

所以,你只做一个并遍历数组foreach中的所有变量$helper

    $usersNew=array("mike", "john");
    $usersLost=array("anna", "maria");

    //I prefer to avoid merge performance, so I'm deleting this, though it works
    /*$data1 = array('userid' => $userid,
                   'date' =>  date('Y-m-d')
    );*/

    foreach ($helper as $arrayName => $dbCondition) {
        foreach ($$arrayName as $f) {
            $data = array('userid' => $userid,
                          'date' =>  date('Y-m-d'),
                          $dbCondition => $f
                     );
            $exists = $this->MyModel->find('first',
                                     array('conditions' => array(
                                                 'MyModel.userid' => $userid,
                                                 'MyModel.date' => date('Y-m-d'),
                                                 'MyModel.'.$dbCondition => $f
                      ) ));


            if ($exists == FALSE) {
                $this->MyModel->create();
                $this->MyModel->save($data);
            }

       }
   }

我没有测试代码,但它应该可以在没有市长修改的情况下工作,也许是我缺少的结束 } 或类似的东西。

如果由于某种原因,这段代码给你带来了问题(有时发生在我身上)

$data = array('userid' => $userid,
                      'date' =>  date('Y-m-d'),
                      $dbCondition => $f
                 );

分两部分做

$data = array('userid' => $userid,
                      'date' =>  date('Y-m-d'),
                 );
$data[$dbCondition] = $f;

诀窍是双精度$$变量变量)并$helper以适合您的方式组织数组。我希望我说得足够清楚。

于 2013-06-18T17:30:11.140 回答