Получение значений многомерного массива, где ключевое значение находится в другом массиве

#php

#php

Вопрос:

У меня есть массив курсов:

  Array
        (
           [0] => BIOL-1108
           [1] => BIOL-1308
           [2] => BIOL-2401
           [3] => BIOL-2402
       )
 

И многомерный массив завершенных курсов, который выглядит следующим образом:

 Array
(
    [course] => Array
        (
            [0] => Array
                (
                    [course] => BIOL-2401
                    [title] => BIOL-2401 - Human Anatomy amp; Physiology I
                    [grade] => A
                )

            [1] => Array
                (
                    [course] => HIST-1301
                    [title] => HIST-1301 - History of the U.S. I
                    [grade] => B
                )

            [2] => Array
                (
                    [course] => MATH-0303
                    [title] => MATH-0303 - Intermediate Algebra
                    [grade] => F
                )
             [3] => Array
                (
                    [course] => BIOL-1108
                    [title] => BIOL-1108 - Life Science I Lab
                    [grade] => B
                )

            [4] => Array
                (
                    [course] => BIOL-1308
                    [title] => BIOL-1308 - Life Science I
                    [grade] => C
                )

       )
)
 

Я хочу повторить только курс, название и оценку, если они существуют в первом массиве. Я думаю, что мне нужен цикл foreach, но я застрял.

Комментарии:

1. Просто для подтверждения: ваш ожидаемый результат здесь будет 2401 and 1308 ?

2. 1108 также существует в обоих.

3. да, эти три. Затем я проведу проверку массива course по сравнению с 7 другими массивами с аналогичными данными coursa (математика, изобразительное искусство и т. Д.)

Ответ №1:

Вы на правильном пути, поскольку вам нужно перебрать значения вашего многомерного массива, а затем посмотреть, есть ли курсы в вашем массиве курсов. Это можно сделать с помощью foreach в сочетании с функцией in_array .

 <?php
        
$courses = array('BIOL-1108', 'BIOL-1308', 'BIOL-2401','BIOL-2402');

$completed_courses = array(
    'course' => array(
                array(
                    'course' => 'BIOL-2401',
                    'title' => 'BIOL-2401 - Human Anatomy amp; Physiology I',
                    'grade' => 'A'
                ),
                array(
                    'course' => 'HIST-1301',
                    'title' => 'HIST-1301 - History of the U.S. I',
                    'grade' => 'B'
                ),
                array
                (
                    'course' => 'MATH-0303',
                    'title' => 'MATH-0303 - Intermediate Algebra',
                    'grade' => 'F'
                ),
                array
                (
                    'course' => 'BIOL-1108',
                    'title' => 'BIOL-1108 - Life Science I Lab',
                    'grade' => 'B'
                ),
                array
                (
                    'course' => 'BIOL-1308',
                    'title' => 'BIOL-1308 - Life Science I',
                    'grade' => 'C'
                )

       )

    );

  

foreach( $completed_courses['course'] as $curr ){
    if(in_array($curr['course'], $courses)) {
        echo 'COURSE : ' . $curr['course'] . PHP_EOL;
        echo 'TITLE : ' .  $curr['title'] . PHP_EOL;
        echo 'GRADE : ' .  $curr['grade'] . PHP_EOL;
    }
}
 

Комментарии:

1. Это тот, который работал лучше всего для меня, и его было проще всего адаптировать. Очень признателен!

2. Рад, что смог помочь

Ответ №2:

Вы, вероятно, ищете array_flip функцию, чем это довольно просто.

 <?php

$courses = [
    'BIOL-1108',
    'BIOL-1308'
];

$completed = [
    'course' => [
        [
            'course' => 'BIOL-1108',
            'title' => 'title',
            'grade' => 'C'
        ],
        [
            'course' => 'BIOL-1308',
            'title' => 'title',
            'grade' => 'C'
        ],
        [
            'course' => 'BIOL-1408',
            'title' => 'title',
            'grade' => 'C'
        ]
    ]
];


$courses = array_flip($courses);

foreach ($completed['course'] as $row) {
    if (!isset($courses[$row['course']])) {
        echo $row['course'] . '<BR>'; // returns BIOL-1408 in my example
    }
}
 

Комментарии:

1. Мне нужно, чтобы он извлек 2 из трех, а не BIOL-1408 в этом примере. будет ли isset вместо!isset правильным вместо

2. @trf: извините, isset выполняйте задание 🙂

Ответ №3:

Вы можете перебирать свой массив (предполагая имена переменных) и использовать in_array , чтобы проверить, существует ли название курса.

 foreach($user['course'] as $course):
    if(in_array($course['title'], $completedCourses)):
        printf('Title: %s, Grade: %s', $course['title'], $course['grade']);
    endif;
endforeach;
 

Комментарии:

1. Ну, видимо, у меня есть 3 ответа, которые работают. Спасибо всем троим из вас. Я принял первый ответ, хотя все три технически выполняют эту работу. но все проголосовали. Я с нетерпением жду любых комментариев, которые поступят, чтобы я мог узнать немного больше.