Is & quot; array_count_values ​​& quot; правильная функция для использования?

Я делаю программу составления расписания для школьного проекта. Я пытался создать ряд функций для этого с использованием 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) {

0

Решение

Вы, вероятно, хотите кол-() в строке 30, но также обратите внимание, что если $ Дня [$ темы] это массив, там есть другая синтаксическая ошибка

$count = count($day[$subject]);

Кроме того, избавьтесь от предупреждения в строке 29 следующим образом:

if (is_array($timetable)) {
foreach ($timetable as $day) {
if (!empty($day[$subject])) {
$count += count($day[$subject]);
}
}
}
2

Другие решения

while (Check_end($subjects, $timetable == TRUE)) {сравниваешь $timetable == TRUE в качестве второго аргумента Check_end функция означает, что вы передаете логическое значение, а не массив. Вы, вероятно, хотите переместить закрывающую скобку с конца строки на после $timetable так что вы передаете в расписание и сравниваете возвращаемое значение с истинным, как while (Check_end($subjects, $timetable) == TRUE) {

Повторное чтение ошибок, похоже, это решило бы все проблемы, возникающие из $timetable не будучи массивом. Ты не можешь foreach цикл по истине / ложи, вы не можете получить доступ Maths и это логическое значение, поэтому нет смещения 2 или 4, даже если приведено к строке.

2

По вопросам рекламы [email protected]