2013-06-17 2 views
0

У меня есть следующий код. Я пытаюсь сделать его проще и короче. Я создал массив $data1 и добавил соответствующие данные с array_merge и сохранил его в моей модели. Но учтите, что $data1 и $exists имеют одинаковый код внутри. Можно ли передать массив $data1 в метод поиска MyModel без переписывания того же кода?CakePHP модели с аналогичными данными

Из-за того, что мне нужно создать несколько строк в этом фрагменте, я использовал 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); 
      } 
     } 

ответ

1

Для оптимизации кода, возможно, это не лучшее место, чтобы спросить. Для этого есть и другие «братья и сестры», например 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); 
      } 

     } 
    } 

Я не проверить код, но он должен работать без изменений мэра, возможно закрытие} I» m отсутствует или что-то в этом роде.

Если по какой-то причине этот кусок кода дает вам проблемы (бывает со мной иногда)

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

сделать это в двух частях

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

Хитрость заключается в двойной $$ (variable variables) и организовать массив $helper таким образом, который работает для вас. Надеюсь, я сделал это достаточно ясно.

+0

Также благодарим вас за ссылку на просмотр кода. Я не знал этого сайта. – trante