Расставляй правильно приоритеты и не отвлекайся на мелочи

PHP: заменить значения массива значениями из другого массива по ключам

Если есть необходимость заменить в исходном массиве все значения по ключам, которые присутствуют в другом массиве, навскидку вспоминается такая PHP функция, как array_replace, однако у нее есть такой неприятный побочный сайд-эффект, как объединение массивов. Иными словами, исходный (заменяемый) массив получит все ключи со значениями, которые отсутствуют в нем, но содержатся в последующих, заменяющих массивах.

По мне, это довольно неожиданное поведение, которое никак не ждешь от названия array_replace, это скорее всего какой-то array_replace_merge. Однако, эта "проблема" вполне решаема с помощью вот такой маленькой, почти однострочной функции:


<?php
/**
 * @param array<mixed> $array
 * @param array<mixed> $replacements
 *
 * @return array<mixed>
 */
function arrayReplaceByKeys(array $array, array ...$replacements): array
{
    foreach ($replacements as $replacement) {
        $array = array_replace($array, array_intersect_key($replacement, $array));
    }

    return $array;
}

Теперь, к примеру, если мы вызовем вот такой код


<?php
    $where = [ 1, 2, 3 ];

    print_r(
        arrayReplaceByKeys($where,
            [ 0 => 56 ],
            [ 2 => 33 ],
            [ 5 => 77, 0 => 57 ]),
    );

Получим вполне ожидаемый ответ:


Array
(
    [0] => 57
    [1] => 2
    [2] => 33
)
Ответить
Обязательные поля помечены *