У меня есть ряд пользователей, которые выглядят так:

Array
(
    [0] => Array
        (
            [email] => oldemail@email.com
            [state] => Remote
        )
    [1] => Array
        (
            [email] => diditwork@email.com
            [state] => HI
        )
)

У меня есть еще один массив, который выглядит так:

Array
(
    [0] => Array
        (
            [title] => Marketing Coordinator
            [location] => Chicago
            [state] => IL
        )

    [1] => Array
        (
            [title] => Sales Manager (MA)
            [location] => Springfield
            [state] => IL
        )

    [2] => Array
        (
            [title] => Security Guard/Driver
            [location] => Big Island
            [state] => HI
        )

    [3] => Array
        (
            [title] => Director of Sales and Operation Planning
            [location] => Honolulu
            [state] => HI
        )

    [4] => Array
        (
            [title] => Associate, Strategic Finance 
            [location] => Joliet
            [state] => IL
        )
)

Я пытаюсь объединить два массива. У них есть общее «государство». Мой желаемый результат таков:

Array
(
    [0] => Array
        (
            [email] => oldemail@email.com
            [state] => IL
            [jobs] => Array
            (
                    [0] => Array
                    (
                            [title] => Marketing Coordinator
                            [location] => Chicago
                            [state] => IL
                    )

                    [1] => Array
                    (
                            [title] => Sales Manager (MA)
                            [location] => Springfield
                            [state] => IL
                    )
                    [2] => Array
                    (
                            [title] => Associate, Strategic Finance
                            [location] => Joliet
                            [state] => IL
                    )
                ) 
        )

    [1] => Array
        (
            [email] => diditwork@email.com
            [state] => HI
            [jobs] => Array
            (
                    [0] => Array
                    (
                            [title] => Security Guard/Driver
                            [location] => Big Island
                            [state] => HI
                    )

                    [1] => Array
                    (
                            [title] => Director of Sales and Operation Planning
                            [location] => Honululu
                            [state] => HI
                    )
                ) 
        )
)
0
sjackson 17 Сен 2021 в 01:58

2 ответа

Лучший ответ

Сначала проиндексируйте массив вакансий по состоянию. (Можно достичь своей цели и без этого, но это значительно упрощает задачу.)

foreach ($jobs as $job) {
    $jobs_by_state[$job['state']][] = $job;
}

Затем выполните итерацию по массиву пользователей и добавьте набор заданий, соответствующих состоянию каждого пользователя.

foreach ($users as &$user) {
    $user['jobs'] = $jobs_by_state[$user['state']];
}

Рабочий пример: https://3v4l.org/hSY4G

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

1
Don't Panic 16 Сен 2021 в 23:35

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

Например так:

// loop through all jobs
foreach($jobs as $job){

    //loop through all users and get the current user element as reference (& parameter), so when $user is manipulated, the original element is changed, not a copy (as in a "normal" foreach loop)
    foreach($users as &$user) {

        // if the state of the current user matches the state of the current job, it must be appended to the original user
        if($user['state'] === $job['state']){

            // check, if jobs have already been appended to the user
            if(!isset($user['jobs'])) {

                // if not, we need to create the jobs key for this user and define a new, empty array
                $user['jobs'] = [];
            }

            // finally, append the job to the original user
            $user['jobs'][] = $job;
        }
    }
}
1
stui 16 Сен 2021 в 23:44