"array_count_values" 是正确使用的函数吗?
Is "array_count_values" the the correct function to use?
我正在为学校项目制作修订时间表生成程序。我尝试使用二维数组创建许多函数来执行此操作,但我收到很多错误,并认为它与我在函数中使用的库函数 '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。并将值数学和物理分配给数组,直到它们分别被使用指定的次数。 'check_subject_availability' 函数是为了查看题目是否被使用了指定的次数,return true of false.Sorry 提前用于格式错误的问题和编写错误的代码。
下面是我在代码为运行时遇到的错误截图:
这些行引用了这些代码
第 29 行
foreach ($timetable as $day) {
第 30 行
$count += array_count_values($day)[$subject];
第 33 行
if ($count < $subjects[$subject]) {
第 42 行
if ($timetable[$day][$slot] == null) {
您可能希望在第 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]);
}
}
}
while (Check_end($subjects, $timetable == TRUE)) {
,您将 $timetable == TRUE
作为第二个参数与 Check_end
函数进行比较,这意味着您传递的是布尔值,而不是数组。您可能希望将右括号从行尾移动到 $timetable
之后,以便传入时间表并将 return 值与 true 进行比较,例如 while (Check_end($subjects, $timetable) == TRUE) {
再次阅读错误,这似乎可以解决所有源于 $timetable
不是数组的问题。你不能 foreach
遍历 true/false,你不能访问 Maths
并且它是一个布尔值,所以没有偏移量 2 或 4,即使被强制转换为字符串。
我正在为学校项目制作修订时间表生成程序。我尝试使用二维数组创建许多函数来执行此操作,但我收到很多错误,并认为它与我在函数中使用的库函数 '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。并将值数学和物理分配给数组,直到它们分别被使用指定的次数。 'check_subject_availability' 函数是为了查看题目是否被使用了指定的次数,return true of false.Sorry 提前用于格式错误的问题和编写错误的代码。
下面是我在代码为运行时遇到的错误截图:
这些行引用了这些代码
第 29 行
foreach ($timetable as $day) {
第 30 行
$count += array_count_values($day)[$subject];
第 33 行
if ($count < $subjects[$subject]) {
第 42 行
if ($timetable[$day][$slot] == null) {
您可能希望在第 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]);
}
}
}
while (Check_end($subjects, $timetable == TRUE)) {
,您将 $timetable == TRUE
作为第二个参数与 Check_end
函数进行比较,这意味着您传递的是布尔值,而不是数组。您可能希望将右括号从行尾移动到 $timetable
之后,以便传入时间表并将 return 值与 true 进行比较,例如 while (Check_end($subjects, $timetable) == TRUE) {
再次阅读错误,这似乎可以解决所有源于 $timetable
不是数组的问题。你不能 foreach
遍历 true/false,你不能访问 Maths
并且它是一个布尔值,所以没有偏移量 2 或 4,即使被强制转换为字符串。