是" array_count_values"要使用的正确函数吗?

时间:2016-11-23 18:34:58

标签: php arrays function foreach invalid-argument

我正在为学校项目制作修订时间表。我尝试使用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。事先为格式错误的问题和编写错误的代码提前。

以下是代码运行时遇到的错误的屏幕截图: screenshot

这些行引用了这些代码

第29行

foreach ($timetable as $day) {

第30行

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

第33行

if ($count < $subjects[$subject]) {

第42行

if ($timetable[$day][$slot] == null) {

2 个答案:

答案 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,即使被强制转换为字符串。