2016-11-24 61 views
-1

爲學校項目創建修訂時間表,讓用戶在爲每個項目選擇主題和多少小時之前,將其輸入到2d數組中,然後將其用作表格。我已經寫了下面的代碼,通過前一頁的帖子獲取數組$ subject。未將數值放入數組

$ subject是一個二維數組,第一個級別是用戶選擇的主題,第二個是用戶需要多少小時的主題。

的代碼應採取$主題數組,並用它在一些功能來填充陣列,但是當我運行的代碼,我只是得到一個空數組

下面是代碼

<?php 
$timetable = array(

"0" => array  // 0 = Monday 6 = Sunday 
    // 0 - 23 = horus 
(
    "0" => '', 
    "1" => '', 
    "2" => '', 
    "3" => '', 
    "4" => '', 
    "5" => '', 
    "6" => '', 
    "7" => '', 
    "8" => '', 
    "9" => '', 
    "10" => '', 
    "11" => '', 
    "12" => '', 
    "13" => '', 
    "14" => '', 
    "15" => '', 
    "16" => '', 
    "17" => '', 
    "18" => '', 
    "19" => '', 
    "20" => '', 
    "21" => '', 
    "22" => '', 
    "23" => '' 
), 
"1" => array 
(
    "0" => '', 
    "1" => '', 
    "2" => '', 
    "3" => '', 
    "4" => '', 
    "5" => '', 
    "6" => '', 
    "7" => '', 
    "8" => '', 
    "9" => '', 
    "10" => '', 
    "11" => '', 
    "12" => '', 
    "13" => '', 
    "14" => '', 
    "15" => '', 
    "16" => '', 
    "17" => '', 
    "18" => '', 
    "19" => '', 
    "20" => '', 
    "21" => '', 
    "22" => '', 
    "23" => '' 
), 
"2" => array 
(
    "0" => '', 
    "1" => '', 
    "2" => '', 
    "3" => '', 
    "4" => '', 
    "5" => '', 
    "6" => '', 
    "7" => '', 
    "8" => '', 
    "9" => '', 
    "10" => '', 
    "11" => '', 
    "12" => '', 
    "13" => '', 
    "14" => '', 
    "15" => '', 
    "16" => '', 
    "17" => '', 
    "18" => '', 
    "19" => '', 
    "20" => '', 
    "21" => '', 
    "22" => '', 
    "23" => '' 
), 
"3" => array 
(
    "0" => '', 
    "1" => '', 
    "2" => '', 
    "3" => '', 
    "4" => '', 
    "5" => '', 
    "6" => '', 
    "7" => '', 
    "8" => '', 
    "9" => '', 
    "10" => '', 
    "11" => '', 
    "12" => '', 
    "13" => '', 
    "14" => '', 
    "15" => '', 
    "16" => '', 
    "17" => '', 
    "18" => '', 
    "19" => '', 
    "20" => '', 
    "21" => '', 
    "22" => '', 
    "23" => '' 
), 
"4" => array 
(
    "0" => '', 
    "1" => '', 
    "2" => '', 
    "3" => '', 
    "4" => '', 
    "5" => '', 
    "6" => '', 
    "7" => '', 
    "8" => '', 
    "9" => '', 
    "10" => '', 
    "11" => '', 
    "12" => '', 
    "13" => '', 
    "14" => '', 
    "15" => '', 
    "16" => '', 
    "17" => '', 
    "18" => '', 
    "19" => '', 
    "20" => '', 
    "21" => '', 
    "22" => '', 
    "23" => '' 
), 
"5" => array 
(
    "0" => '', 
    "1" => '', 
    "2" => '', 
    "3" => '', 
    "4" => '', 
    "5" => '', 
    "6" => '', 
    "7" => '', 
    "8" => '', 
    "9" => '', 
    "10" => '', 
    "11" => '', 
    "12" => '', 
    "13" => '', 
    "14" => '', 
    "15" => '', 
    "16" => '', 
    "17" => '', 
    "18" => '', 
    "19" => '', 
    "20" => '', 
    "21" => '', 
    "22" => '', 
    "23" => '' 
), 
"6" => array 
(
    "0" => '', 
    "1" => '', 
    "2" => '', 
    "3" => '', 
    "4" => '', 
    "5" => '', 
    "6" => '', 
    "7" => '', 
    "8" => '', 
    "9" => '', 
    "10" => '', 
    "11" => '', 
    "12" => '', 
    "13" => '', 
    "14" => '', 
    "15" => '', 
    "16" => '', 
    "17" => '', 
    "18" => '', 
    "19" => '', 
    "20" => '', 
    "21" => '', 
    "22" => '', 
    "23" => '' 
) 
); 

$subjects = $_POST; 

function pick_random_subject($subjects, $timetable) 
{ 
$available = FALSE; 
while ($available == FALSE) { 
    $subject = array_rand($subjects); 
    if (check_subject_availability($subjects, $timetable, $subject)) { 
     $available = TRUE; 
    } 
} 
return $subject; 
} 

function check_subject_availability($subjects, $timetable,$subject) 
{ 
$count = 0; 
foreach ($timetable as $day) { 
    $count += array_count_values($day)[$subject]; 
} 

if ($count < $subjects[$subject]) { 
    return True; 
} else { 
    return false; 
} 
} 

function verify_available_slot($timetable, $day, $slot) 
{ 
if ($timetable[$day][$slot] == '') { 
    return true; 
} else { 
    return false; 
} 
} 

function pick_random_slot($timetable) 
{ 

$available = FALSE; 
while ($available == FALSE) { 
    $day = rand(0, 6); 
    $hour = rand(0, 23); 

    $available = verify_available_slot($timetable, $day, $hour); 
} 
return [$day, $hour]; 
} 

function Check_end($subjects, $timetable) 
{ 
$finished = FALSE; 
foreach ($subjects as $subject) { 
    if (!check_subject_availability($subjects, $timetable, $subject)) { 
     $finished = TRUE; 
     break; 
    } 
} 
return $finished; 
} 
if(isset($_POST)) { 
while(Check_end($subjects, $timetable)== FALSE) 
{ 

$subject = pick_random_subject($subjects, $timetable); 
$slot = pick_random_slot($subject); 
$day = $slot[0]; 
$hour = $slot[1]; 
$timetable[$day][$hour] = $subject; 
} 
} 
else { 
header('http://localhost/timetable/TimetableAlgorithmn.php'); 
} 

?> 
<pre> 
<?print_r($timetable) ?> 
<pre> 

注:我認爲問題在於函數「check_subject_availability」,但我不知道。

+1

只是一個提示:'返回$計數<$科目[$主題]'是一樣的'如果($計數< $ subjects [$ subject]){return True; } else {return false; ''但更好的可讀性,可能更快。 – Christoph

+0

也許你可以用一個或兩個來創建這個龐大的結構?你擁有的代碼是巨大的! –

回答

2

我無法測試它沒有周邊的代碼,但至少一個問題應在Check_end()check_subject_availability調用之間在於:

function Check_end($subjects, $timetable) 
{ 
$finished = FALSE; 
foreach ($subjects as $subject) { 
    if (!check_subject_availability($subjects, $timetable, $subject)) { 
     $finished = TRUE; 
     break; 
    } 
} 
return $finished; 
} 

此代碼假定所述對象的名稱被例如一個值$subjects == ['subject1']

check_subject_availability()中,您將其用作主題的關鍵字,例如: $subjects == ['subject1' => 5]

function check_subject_availability($subjects, $timetable,$subject) 
{ 
$count = 0; 
foreach ($timetable as $day) { 
    $count += array_count_values($day)[$subject]; 
} 

return $count < $subjects[$subject]; // usage as key 
} 

也許改變foreach ($subjects as $subject)foreach ($subjects as $subject => $max_count)解決您的問題。

另一個錯誤:

while(Check_end($subjects, $timetable)== FALSE) 
{ 
    $subject = pick_random_subject($subjects, $timetable); 
    list($day, $hour) = pick_random_slot($timetable); // $timetable not $subject 
    $timetable[$day][$hour] = $subject; 
} 

最後的最後一個錯誤(至少要得到它的工作對我來說:)

function Check_end($subjects, $timetable) 
{ 
$finished = TRUE; 
foreach ($subjects as $subject => $max_n) { 
    if (check_subject_availability($subjects, $timetable, $subject)) { 
     $finished = false; 
    } 
} 
return $finished; 
} 

你的版本只要一個主題是check_subject_availability停止()! 。此版本僅在所有主題不可用時纔會停止。

最後一個提示:您應該考慮我在下面的代碼中使用的隨機播放方法,因爲當時間表填滿並且無法再找到空插槽時,您的版本會慢慢出現問題。

一個小插件:

$timetable = array_fill(0, 7, array_fill(0, 24, '')); 

結構完全相同的數組作爲您的多頭排列()語句。

一個更大的附加: 你的代碼可以重構這個:

$timetable = []; 
foreach ($_POST as $subject => $n) // add in the required amount of subjects 
    $timetable = array_merge($timetable, array_fill(0, $n, $subject)); 
$timetable = array_merge($timetable, array_fill(0, 24 * 7 - count($timetable), '')); // fill the array with empty values 
shuffle($timetable); // shuffle the set 
$timetable = array_chunk($timetable, 24); // split it into 7 days 
+0

謝謝@Christoph。這完全解決了這個問題。數組現在被填充,但並不總是正確的數量。例如,如果你使用2科目數學(9)和物理(6)。該數組將正確填充第一個數字,即數學的9個實例,但看似隨機數量的第二個科目即只有1個物理學。 –

+1

@Adam Anderson我已經添加了6行代碼,它們與您當前的代碼/您要實現的內容相當,但如果您希望我進一步搜索您的bug,請告訴我。 – Christoph

+1

@Adam Anderson我的答案現在包含足夠的錯誤以使您的代碼正常工作。隨時接受它或提出進一步的問題:) – Christoph