Такого рода задачи можно сделать проще с functional programming , В принципе, вам нужно фильтровать массив учеников по некоторым предикатам (например, предметы, которые они изучают или не изучают). Для этого мы можем написать higher-order function. Он будет использовать array_filter
:
function filterStudensBySubject($students, callable $subjectCriteria = null)
{
if (is_null($subjectCriteria)) {
$subjectCriteria = function ($subject) {
return true;
};
}
return array_filter($students, function ($student) use ($subjectCriteria) {
if (!isset($student['Subject'])) {
return false;
}
return $subjectCriteria($student);
});
}
Тогда мы можем написать некоторые из условий для обеспечения этой функции:
$subjects = ['Urdu'];
$studySubjects = function ($student) use ($subjects) {
return !empty(array_intersect($student['Subject'], $subjects));
};
$doesNotStudySubjects = function ($student) use ($subjects) {
return empty(array_intersect($student['Subject'], $subjects));
};
Мы использовали array_intersect
, чтобы получить массив элементов, которые присутствуют в обоих массивах.
Наконец, мы можем получить студентов, которые изучают предметы и которые не:
$studentsWhoStudySubjects = filterStudensBySubject($var, $studySubjects);
$studentsWhoDoNotStudySubjects = filterStudensBySubject($var, $doesNotStudySubjects);
Вот working demo.
Этот подход позволит вам использовать ту же функцию с любыми критериями по предмету (изучать только два предмета, изучать не более трех предметов и т. Д.) Без переписывания логики цикла.
Дополнение:
Вы спрашивали о отображающих ключей:
$echoKey = function ($key) {
echo $key, PHP_EOL;
};
$keys = array_keys($studentsWhoStudySubjects);
array_walk($keys, $echoKey);
echo PHP_EOL;
$keys = array_keys($studentsWhoDoNotStudySubjects);
array_walk($keys, $echoKey);
Читайте о array_keys
и array_walk
.
Это может показаться большим количеством кода для такой тривиальной задачи.Но этот подход поможет вам научиться писать развязанный многоразовый код. Как я уже упоминал, мы можем использовать нашу функцию filterStudensBySubject
, чтобы отфильтровать учащихся по любому условию (что касается предмета) без необходимости переписывать саму функцию.
Удивительные работы. –
супер точный логика. теперь я должен посмотреть, что, если я введу несколько предметов. –