2016-01-27 18 views
5

Tôi có vòng lặp for trong mã của mình. Tôi đã không thay đổi bất cứ điều gì về phần này của mã trong khoảng 5-6 ngày và tôi không bao giờ có vấn đề với nó.Tại sao mã PHP của tôi không hoạt động nữa mà không có lý do?

Kể từ ngày hôm qua tôi đã cố gắng để tải lại mã của tôi và nó allways mang lại cho tôi lỗi này:

Maximum execution time of 30 seconds exceeded - in LogController.php line 270 

Vâng, tôi không thể giải thích tại sao nhưng có lẽ ai đó của bạn có thể nhìn qua nó.

Đây là mã của tôi xung quanh dòng 270.

$topten_sites = []; 
for ($i = 0; $i <= count($sites_array); $i++) { 
    if ($i < 10) { // this is 270 
     $topten_sites[] = $sites_array[$i]; 
    } 
} 
$topten_sites = collect($topten_sites)->sortByDesc('number')->all(); 

Như tôi đã nói, nó làm việc một cách hoàn hảo, vậy tại sao nó mang lại cho tôi một lỗi? Nếu tôi bỏ ghi chú các dòng này và mọi dòng khác chứa mảng $ topten_sites, thì mã sẽ hoạt động trở lại.

+1

một cái gì đó là lạ trong vòng lặp for, '$ i <= $ sites_array' phía bạn. Tôi nghĩ rằng nó phải là '$ i <= count ($ sites_array)' – PrinceG

+0

Tôi đồng ý với @PrinceG - cần được thay đổi thành 'count ($ sites_array)' hoặc 'sizeof ($ sites_array)' – RamRaider

+0

FYI http://www.icosaedro.it/phplint/ đã phát hiện lỗi này. –

Trả lời

15

này trông sai:

for ($i = 0; $i <= $sites_array; $i++) { 
     if ($i < 10) { // this is 270 
      $topten_sites[] = $sites_array[$i]; 
     } 
    } 

Nếu $sites_array là một mảng, nó làm cho không có ý nghĩa để so sánh nó với một số nguyên, do đó bạn có thể có một vòng lặp không bao giờ kết thúc.

Nếu bạn chỉ cần 10 yếu tố đầu tiên trong mảng khác, bạn có thể thay thế vòng lặp của bạn với:

$topten_sites = array_slice($sites_array, 0, 10); 
+0

Hoặc sử dụng ngắt để giết vòng lặp khi bạn đã hoàn thành nó tốt hơn –

+1

. sử dụng '$ i <10' làm điều kiện vòng lặp' for' – roullie

+1

Vâng .. Điều đó làm việc hoàn hảo o.o Cảm ơn vì điều này! Tôi không biết làm thế nào vấn đề này xuất hiện nhưng cảm ơn! – ItzMe42

2

Tại sao Bạn sẽ lặp toàn bộ mảng nếu bạn chỉ muốn 10 kết quả đầu tiên?

for ($i = 0; $i < 10; $i++) { 
      $topten_sites[] = $sites_array[$i]; 
    } 
1

Để trả lời câu trả lời thực tế; mã không bao giờ ngừng hoạt động "vì không có lý do". Mã hoạt động hoặc không, cả hai đều vì một lý do. Nếu nó ngừng hoạt động một cái gì đó đã thay đổi so với các thử nghiệm trước đó của bạn. "Đôi khi nó hoạt động, đôi khi nó không" rơi vào cùng một logic. Mã sẽ luôn luôn hành xử giống hệt nhau mọi lúc, chỉ một số tham số đã thay đổi, bạn phải tìm cái nào.

Trong trường hợp của bạn, tôi đoán các mục nhập trong mảng của bạn đã tăng lên. PHP và mảng không phải là bạn tốt nhất khi nói đến tốc độ, mảng chậm. Nó có thể rất tốt là mảng của bạn là nhỏ hơn khi bạn thử nghiệm nó (không phải là nhanh nhất để bắt đầu với), nhưng bây giờ với số tiền hiện tại nó chỉ đạt ngưỡng 30 giây. Nó cũng có thể là một phần của mã trước khi bit này mã mất rất nhiều thời gian (nói đột nhiên 28 giây thay vì 20), và vòng lặp của bạn (mà không bao giờ thay đổi) hiện nó làm việc trong 3seconds thường xuyên nó luôn luôn không, bây giờ chạy vào vấn đề

0

Sử dụng nó như thế này:

$topten_sites = []; 
    for ($i = 0; $i <= 10; $i++) { 
     $topten_sites[] = $sites_array[$i]; 
    } 
    $topten_sites = collect($topten_sites)->sortByDesc('number')->all(); 
+0

Tại sao OP nên thử cái này?Một câu trả lời tốt *** sẽ luôn luôn có một lời giải thích về những gì đã được thực hiện và lý do tại sao nó được thực hiện theo cách đó, không chỉ cho OP mà đối với khách truy cập trong tương lai đối với SO. –

Các vấn đề liên quan