我正在为学校项目制作修订时间表。我尝试使用2d数组创建了许多函数来执行此操作,但是我收到了很多错误,并认为它与库函数' array_count_values'我在函数中用来检查主题是否可用。
这是检查主题的代码。
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;
}
}
我认为这是问题的根源,但这是我的其余代码可能导致问题
$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] == null) {
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 == TRUE)) {
$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');
}
var_dump($timetable)
?>
<pre>
<? print $timetable ?>
<pre>
代码应该将通过post给出的主题的值作为二维数组,即数学2,物理3.并将数学和物理值分配给数组,直到它们各自被使用指定的次数。 &#39; check_subject_availability&#39;函数用于查看主题是否已被使用了指定的次数并返回true为false。事先为格式错误的问题和编写错误的代码提前。
这些行引用了这些代码
第29行
foreach ($timetable as $day) {
第30行
$count += array_count_values($day)[$subject];
第33行
if ($count < $subjects[$subject]) {
第42行
if ($timetable[$day][$slot] == null) {
答案 0 :(得分:2)
第30行可能需要count(),但另请注意,如果 $ day [$ subject] 是一个数组,则会出现另一种语法错误。
$count = count($day[$subject]);
另外,如下所示摆脱第29行的警告:
if (is_array($timetable)) {
foreach ($timetable as $day) {
if (!empty($day[$subject])) {
$count += count($day[$subject]);
}
}
}
答案 1 :(得分:2)
while (Check_end($subjects, $timetable == TRUE)) {
,您将$timetable == TRUE
作为第二个参数与Check_end
函数进行比较,这意味着您传入的是布尔值,而不是数组。您可能希望将右括号从行尾移动到$timetable
之后,以便传递时间表并将返回值与true进行比较,如while (Check_end($subjects, $timetable) == TRUE) {
再次阅读错误,这似乎可以解决因$timetable
不是数组而导致的所有问题。你不能foreach
遍历一个真/假,你不能访问Maths
它是一个布尔值所以没有偏移2或4,即使被强制转换为字符串。