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:
$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.in_array_r
function was structured incorrectly.The end fixes resulted in the following changes:
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.
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;
}
}
}