检查数组,以便不添加重复项

Inside my getNearestMeeting method it seems to allow array with the same key and same value.

I'm wanting to check to see if there is key already and meeting_id value. As you see down below that the result from my code so far returns two keys == 6 and they have the same meeting_id == 1812.

What am I doing wrong?

$pupils = array("parent" => array( array ("pupil_name" => "Daniel", "pupil_id" => "5", "pupil_grade" => "87"),
    array ("pupil_name" => "Daniel", "pupil_id" => "5", "pupil_grade" => "86"),
    array ("pupil_name" => "Callum", "pupil_id" => "6", "pupil_grade" => "87")
));

$meetings = array( array("slot_id" => "1", "meeting_id" => "1812", "startTime" => "2016-10-07 14:30:00", 
         "endTime" => "2016-10-07 14:35:00", "grade_id" => "87"),
   array("slot_id" => "2", "meeting_id" => "1812", "startTime" => "2016-10-07 14:35:00", 
         "endTime" => "2016-10-07 14:40:00", "grade_id" => "87"),
   array("slot_id" => "3", "meeting_id" => "1812", "startTime" => "2016-10-07 14:40:00", 
         "endTime" => "2016-10-07 14:45:00", "grade_id" => "87"),
   array("slot_id" => "4", "meeting_id" => "1813", "startTime" => "2016-10-07 15:05:00", 
         "endTime" => "2016-10-07 15:10:00", "grade_id" => "-1"),
   array("slot_id" => "6", "meeting_id" => "1813", "startTime" => "2016-10-07 15:10:00", 
         "endTime" => "2016-10-07 15:15:00", "grade_id" => "-1"),
   array("slot_id" => "9", "meeting_id" => "1813", "startTime" => "2016-10-07 15:20:00", 
         "endTime" => "2016-10-07 15:25:00", "grade_id" => "-1"),
   array("slot_id" => "10", "meeting_id" => "1813", "startTime" => "2016-10-07 15:30:00", 
         "endTime" => "2016-10-07 15:35:00", "grade_id" => "88"),
   array("slot_id" => "11", "meeting_id" => "1813", "startTime" => "2016-10-07 15:40:00", 
         "endTime" => "2016-10-07 15:45:00", "grade_id" => "88"),
   array("slot_id" => "17", "meeting_id" => "1813", "startTime" => "2016-10-07 15:50:00", 
         "endTime" => "2016-10-07 15:50:00", "grade_id" => "88")
);

function in_array_r($array, $key, $val) {
    foreach ($array as $item) {
        if (key($item) == $key && isset($item[$key]) && $item[$key]["meeting_id"] == $val)
            return true;
        else 
            return false;
    }
}
function getNearestMeeting($meetings){ 
    global $pupils;
    $ignore = array(); 
    $current_pupil_id = "5";
    $current_pupil_grade_id = "87";

    foreach($meetings as $item){
        if($current_pupil_grade_id === $item["grade_id"]){
            $earliest = strtotime($item["endTime"]); 
            $ignore[$current_pupil_id][] = array("meeting_id" => $item["meeting_id"], "endTime" => $item["endTime"]);
            break;
        }
    }

    $counter = 0;
    foreach($pupils["parent"] as $item){
        $counter++;
        foreach($meetings as $item2){ 
            $lastArray = end(end($ignore));
            $previousTime = strtotime($lastArray["endTime"]);
            if(!in_array_r($ignore, $item["pupil_id"], $item2["meeting_id"])) {
                if(isset($previousTime) && strtotime($item2["startTime"]) >= $previousTime && strtotime($item2["startTime"]) >= $earliest){
                    if($item["pupil_grade"] === $item2["grade_id"]){    
                        $ignore[$item["pupil_id"]][] = array("meeting_id" => $item2["meeting_id"], "endTime" => $item2["endTime"]);
                    }
                }
            }                   
        }               
    }
    print_r($ignore);
}

getNearestMeeting($meetings);

result from print_r($ignore);:

Array
(
    [0] => Array
        (
            [5] => Array
                (
                    [meeting_id] => 1812
                    [endTime] => 2016-10-07 14:35:00
                )

        )

    [1] => Array
        (
            [6] => Array
                (
                    [meeting_id] => 1812
                    [endTime] => 2016-10-07 14:40:00
                )

        )

    [2] => Array
        (
            [6] => Array
                (
                    [meeting_id] => 1812
                    [endTime] => 2016-10-07 14:45:00
                )

        )

)

After the discussion in the Stack Overflow PHP Chat, the problems identified were the following:

  1. The $ignore array was structured strangely, if a pupil had multiple meetings it would create multiple top-level arrays, when it should have just used one which referenced that particular pupil.
  2. The in_array_r function was structured incorrectly.

The end fixes resulted in the following changes:

For #1:

Additions to the $ignore array were changed to:

$ignore[$item["pupil_id"]][] = array("meeting_id" => $item2["meeting_id"], "endTime" => $item2["endTime"]);

With an additional check to ensure $ignore[$item["public_id"]] is an array, and if it wasn't then to create it before appending a new item to it.

For #2:

The in_array_r function was changed to reflect the new array structure:

function in_array_r($array, $key, $val) {
    if(array_key_exists($key, $array)){
        foreach ($array[$key] as $item) {
            if ($item["meeting_id"] === $val)
                return true;
            else
                return false;
        }
    }
}