2017-09-06 146 views
-3

基本上我只是試圖用一個foreach的數組工作。該陣列包含來自每個設備的數據(大約10000個設備),其中一些由於數據較舊而爲空。我需要在下面的foreach中使用這個數組來確保$ newFault被創建,如果它有錯誤的軟件的話。我超級卡住,不能得到它的工作。在PHP中的數組foreach

任何線索?

請注意,我的陣列必須能夠使用下面的DeviceLogs的關係。

 public function createViaCameras() 
{ 
    set_time_limit(120); 


    //This part removes the entire existing FirmwareFault database for the new info to go in. 
    FirmwareFault::truncate(); 
    CameraUnlinked::truncate(); 

    //This part imports all cameras from today. 
    $today = (new \DateTime); 
    $today->modify('-3 day'); 
    $tomorrow = (new \DateTime); 
    $tomorrow->modify('+1 day'); 

    $devices = Device::take(10)->get(); 
     foreach ($devices as $device) { 


    $logs[$device->id] = DeviceLog::whereNotIn('model', ['Test', 'Test2'])->whereDeviceId($device->id)->whereBetween('created_at', [$today, $tomorrow])->orderBy('created_at', 'desc')->first(); 

} 


    foreach ($logs as $log) { 

     if (count($log->camera)) { 
      if ($log->model = $log->camera->name) { 
       if ($log->acaps == '1' && $log->version !== $log->camera->fwts) { 
         $newFwFault = new FirmwareFault(); 
         $newFwFault->serial = $log->device->serial; 
         $newFwFault->fw = $log->version; 
         $newFwFault->model = $log->model; 
         $newFwFault->new_fw = $log->camera->fwts; 
         $newFwFault->fault_id = $log->acaps; 
         $newFwFault->save(); 
        } elseif ($log->acaps == '2' && $log->version !== $log->camera->fwtb) { 
         $newFwFault = new FirmwareFault(); 
         $newFwFault->serial = $log->device->serial; 
         $newFwFault->fw = $log->version; 
         $newFwFault->model = $log->model; 
         $newFwFault->new_fw = $log->camera->fwdt; 
         $newFwFault->fault_id = $log->acaps; 
         $newFwFault->save(); 
        } elseif ($log->acaps == '3' && $log->version !== $log->camera->fwppt) { 
         $newFwFault = new FirmwareFault(); 
         $newFwFault->serial = $log->device->serial; 
         $newFwFault->fw = $log->version; 
         $newFwFault->model = $log->model; 
         $newFwFault->new_fw = $log->camera->fwppt; 
         $newFwFault->fault_id = $log->acaps; 
         $newFwFault->save(); 
        } elseif ($log->acaps == '4' && $log->version !== $log->camera->fw) { 
         $newFwFault = new FirmwareFault(); 
         $newFwFault->serial = $log->device->serial; 
         $newFwFault->fw = $log->version; 
         $newFwFault->model = $log->model; 
         $newFwFault->new_fw = $log->camera->fw; 
         $newFwFault->fault_id = $log->acaps; 
         $newFwFault->save(); 
        } elseif ($log->acaps == '0' && $log->version !== $log->camera->fw) { 
         $newFwFault = new FirmwareFault(); 
         $newFwFault->serial = $log->device->serial; 
         $newFwFault->fw = $log->version; 
         $newFwFault->model = $log->model; 
         $newFwFault->new_fw = $log->camera->fw; 
         $newFwFault->fault_id = $log->acaps; 
         $newFwFault->save(); 
        } else { 
         $newUnlink = new CameraUnlinked(); 
         $newUnlink->serial = $log->device->serial; 
         $newUnlink->model = $log->model; 
         $newUnlink->save(); 
        } 
      } else { 
      $newUnlink = new CameraUnlinked(); 
      $newUnlink->serial = $log->device->serial; 
      $newUnlink->model = $log->model; 
      $newUnlink->save(); 
      } 
     } else { 
      $newUnlink = new CameraUnlinked(); 
      $newUnlink->serial = $log->device->serial; 
      $newUnlink->model = $log->model; 
      $newUnlink->save(); 
     }; 

    }; 

    return redirect()->back(); 
} 
+0

您的'$ newFault'數組在哪裏?你的意思是'$ newFwFault'? – hassan

+1

也是,你知道這個'$ log-> model = $ log-> camera-> name'? – hassan

+0

是的,$ newFwFault是需要由數組進行處理的那一個。循環中的所有if語句都需要對數組本身進行foreach。 是的,我知道那一部分。這是兩個單獨的關係,基本上對同一事物使用不同的名稱。 – Stoff

回答

0

//我試圖做一些重構,但很難理解你想達到什麼,或者你的問題是什麼。我清理了一下你的代碼並添加了一些評論,我希望這會幫助你確定哪裏出了問題。我重構了你的循環,但是(沒有任何方法去測試它),我相信它的實際結果和以前一樣。

public function createViaCameras() 
    { 
     set_time_limit(120); 

     //This part removes the entire existing FirmwareFault database for the new info to go in. 
     FirmwareFault::truncate(); 
     CameraUnlinked::truncate(); 

     //This part imports all cameras from today. 
     $threeDaysAgo = (new \DateTime)->modify('-3 day'); 
     $tomorrow  = (new \DateTime)->modify('+1 day'); 

     $devices = Device::take(10)->get(); // Why only 10? You also might want to use limit and offset instead, they are closer to the actual query language 
     $logs = [];       // Instantiate first. If the following loop doesn't find any logs, your $logs loop will fail. 
     foreach ($devices as $device) { 
      $logs[$device->id] = DeviceLog::whereNotIn('model', ['Test', 'Test2']) 
       ->whereDeviceId($device->id) 
       ->whereBetween('created_at', [$threeDaysAgo, $tomorrow]) // A log that was created tomorrow??? 
       ->orderBy('created_at', 'desc') 
       ->first();            // Why only the first log? 
     } 

     foreach ($logs as $log) { 

      if (
       !count($log->camera) ||    // $log->camera is an object. Use another function to do the check that you want. What are you checking for`? 
       $log->model !== $log->camera->name 
      ) { 
       $model = new CameraUnlinked(); 
       continue; 
      } 

      $condition1 = $log->acaps === '1' && $log->version !== $log->camera->fwts; 
      $condition2 = $log->acaps === '2' && $log->version !== $log->camera->fwtb; 
      $condition3 = $log->acaps === '3' && $log->version !== $log->camera->fwppt; 
      $condition4 = $log->acaps === '4' && $log->version !== $log->camera->fw; 
      $condition5 = $log->acaps === '0' && $log->version !== $log->camera->fw; 

      if ($condition1 || $condition2 || $condition3 || $condition4 || $condition5) { 
       $model = new FirmwareFault(); 
       $model->fw = $log->version; 
       $model->fault_id = $log->acaps; 

       if ($condition1) { 
        $model->new_fw = $log->camera->fwts; 
       } elseif ($condition2) { 
        $model->new_fw = $log->camera->fwdt; 
       } elseif ($condition3) { 
        $model->new_fw = $log->camera->fwppt; 
       } elseif ($condition4) { 
        $model->new_fw = $log->camera->fw; 
       } elseif ($condition5) { 
        $model->new_fw = $log->camera->fw; 
       } 
      } else { 
       $model = new CameraUnlinked(); 
      } 

      $model->serial = $log->device->serial; 
      $model->model = $log->model; 
      $model->save(); 
     }; 

     return redirect()->back(); 
    }