Я делаю программу составления расписания для школьного проекта. Я пытался создать ряд функций для этого с использованием 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. и присваивать значениям математики и физики массиву, пока каждый из них не будет использоваться указанное количество раз. Функция ‘check_subject_availability’ предназначена для того, чтобы увидеть, использовался ли субъект указанное количество раз, и вернуть 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) {
Вы, вероятно, хотите кол-() в строке 30, но также обратите внимание, что если $ Дня [$ темы] это массив, там есть другая синтаксическая ошибка
$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
так что вы передаете в расписание и сравниваете возвращаемое значение с истинным, как while (Check_end($subjects, $timetable) == TRUE) {
Повторное чтение ошибок, похоже, это решило бы все проблемы, возникающие из $timetable
не будучи массивом. Ты не можешь foreach
цикл по истине / ложи, вы не можете получить доступ Maths
и это логическое значение, поэтому нет смещения 2 или 4, даже если приведено к строке.