Замена массива в многомерном массиве

251
12 апреля 2017, 16:26

Подскажите как проще сделать замену массивов в многомерном массиве.

Имеется конфиг из файла в формате JSON,декодирую его и на выходе получаю вот такой массив.

  Array
    (
        [name] => Tables conf
        [databases] => Array
            (
                [0] => Array
                    (
                        [name] => DB1
                        [tables] => Array
                            (
                                [0] => Array
                                    (
                                        [name] => table1
                                    )
                                [1] => Array
                                    (
                                        [name] => table2
                                    )
                                [2] => Array
                                    (
                                        [name] => table3
                                    )
                            )
                    )
            ) 
)

А так же имеется новый конфиг вида:

Array
(
    [databases] => Array
        (
            [0] => Array
                (
                    [name] => DB1
                    [tables] => Array
                        (
                            [0] => Array
                                (
                                    [tbl_name] => table1
                                )
                            [1] => Array
                                (
                                    [tbl_name] => table2
                                )
                            [2] => Array
                                (
                                    [tbl_name] => table3
                                )
                        )
                )
            [1] => Array
                (
                    [name] => DB2
                    [tables] => Array
                        (
                            [0] => Array
                                (
                                    [tbl_name] => table2
                                )
                            [1] => Array
                                (
                                    [tbl_name] => table3
                                )
                        )
                )
         )
)

Как можно проще внедрить новый конфиг в старый при этом не перезаписывая весь старый, а только изменить какой то массив по ключу иди добавить новый, то есть весь DB1 к примеру заменить на новый DB1 или добавить DB2.

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

$config = $_POST['config'];
            $filteredConfig = array_filter($config['databases'], function($val, $key){
                return !empty($val['tables']);
            }, ARRAY_FILTER_USE_BOTH);
            $fileConfig = file_get_contents('conf/tables_config_vars.json');
            $fileConfig = json_decode($fileConfig, true);
            foreach($fileConfig['databases'] as $key => $val){
                foreach($filteredConfig as $confKey => $confVal){
                    if($val['name'] == $confVal['name']){
                        unset($fileConfig['databases'][$key]);
                        $fileConfig['databases'][] = $confVal;
                    } 
                }
            }
Answer 1

Как-то так:

function mergeConfig(array &$config, array $addConfig)
{
    foreach ($addConfig as $key => $value) {
        if (isset($config[$key]) && is_array($config[$key])) {
            is_array($value)
                ? $this->mergeConfig($config[$key], $value)
                : array_push($config[$key], $value);
        } else {
            $config[$key] = $value;
        }
    }
}

где $config - базовый и результирующий конфиг, к которому нужно подлить другой; $addConfig - конфиг, который нужно добавить

READ ALSO
Получение ip клиента сайта Opera

Получение ip клиента сайта Opera

Есть следующий код определяющий ip клиента

223
Исключение повторение переменных PHP

Исключение повторение переменных PHP

Когда я беру рандомные значения из БД, они часто повторяютсяЧтобы это не происходило, я попытался заново брать значение, но это не помогает

204