Skip to content
Advertisement

Push values one-at-a-time from a flat array into each object of an array of arrays containing objects

I need to push a new property into my array of arrays of objects using the values from a flat array.

My sample arrays:

$users = [
    [
        (object) ["user_id" => 2]
    ],
    [
        (object) ["user_id" => 1],
        (object) ["user_id" => 1],
    ],
    [
        (object) ["user_id" => 2],
        (object) ["user_id" => 2]
    ]
];

$is_admin = [
    false,
    true,
    true,
    false,
    false
];

I need to write is_admin => [boolean value] (one at a time) into each object using the values from the second array.

Desired result:

[
    [
        (object) ["user_id" => 2, "is_admin" => false]
    ],
    [
        (object) ["user_id" => 1, "is_admin" => true],
        (object) ["user_id" => 1, "is_admin" => true],
    ],
    [
        (object) ["user_id" => 2, "is_admin" => false],
        (object) ["user_id" => 2, "is_admin" => false]
    ]
]

I do not know how to map the second array with the first array’s structure. I have tried using array_merge, but it doesn’t work properly with my data structure and requirements.

Advertisement

Answer

You can use array_walk_recursive function:

array_walk_recursive($users, function (&$user) use (&$is_admin) {
    $user->is_admin = current($is_admin);
    next($is_admin);
});

Pay attention that both $user and $is_admin passed by reference.

Also, you can use outer index variable (i.e. $i) to track $is_admin position. In such case, you need to pass (to be more precise enclose) $i along side with $is_admin, only $i will be passed by reference and $is_admin by value. I decided to take advantage of current and next functions, not introducing one more variable.

Here is working demo.

One important thing. If your $is_admin array has fewer elements than $users arrays (they are leaves actually) false value will be assigned to the is_admin field of those users that comes after the point when there are no elements left in $is_admin.

User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement