Объединение массивов из конфигурационных файлов

#php #arrays

#php #массивы

Вопрос:

Испытываю трудности с объединением этих массивов.

Я хочу иметь возможность загружать несколько конфигурационных файлов и создавать один большой массив, чтобы иметь возможность вызывать любое место в моем приложении.

test_config1.php

 $config1=array();
$config1['Key1']['AnotherKey1']='Value 1';
$config1['Key2']['AnotherKey1']='Value 2';
$config1['Key3']['AnotherKey1']='Value 3';

return $config1;
  

test_config2.php

 $config2=array();
$config2['Different Key 1']='Different Value 1';
$config2['Different Key 2']='Different Value 2';
$config2['Different Key 3']='Different Value 3';
$config2['Key3']['AnotherKey1']['test']='Test 1';

return $config2;
  

Настроить класс:

 class Configure
{
    public static $configArray = array();

    public static function loadConfig($configSource)
    {
        # Explicitly turn this into an array.
        $configSource=(array)$configSource;

        # Loop through the array.
        foreach($configSource as $configFileName)
        {
            $config=require_once $configFileName;

            self::$configArray[]=$config;
            unset($config);
        }

        return self::$configArray;
    }
}

print_r(Configure::loadConfig(array('test_config1.php', 'test_config2.php')));

//print_r(Configure::loadConfig('test_config1.php'));
  

Результат:

 Array
(
    [0] => Array
        (
            [Key1] => Array
                (
                    [AnotherKey1] => Value 1
                )

            [Key2] => Array
                (
                    [AnotherKey1] => Value 2
                )

            [Key3] => Array
                (
                    [AnotherKey1] => Value 3
                )

        )

    [1] => Array
        (
            [Different Key 1] => Different Value 1
            [Different Key 2] => Different Value 2
            [Different Key 3] => Different Value 3
            [Key3] => Array
                (
                    [AnotherKey1] => Array
                        (
                            [test] => Test 1
                        )

                )

        )

)
  

Требуется:

 Array
(
    [Key1] => Array
        (
            [AnotherKey1] => Value 1
        )

    [Key2] => Array
        (
            [AnotherKey1] => Value 2
        )

    [Key3] => Array
        (
            [AnotherKey1] => Value 3
            [AnotherKey2] => Array
                (
                    [test] => Test 1
                )
        )


    [Different Key 1] => Different Value 1
    [Different Key 2] => Different Value 2
    [Different Key 3] => Different Value 3
)
  

Я попробовал self::$configArray=array_merge(self::$configArray, $config); , который дает:

 [Key3] => Array
    (
        [AnotherKey2] => Array
            (
                [test] => Test 1
            )

    ) 
  

И , self::$configArray=self::$configArray $config; который исключается $config2['Key3']['AnotherKey2']['test']='Test 1'; из массива.

Ответ №1:

Попробуйте этот код (не тестировался):

 class Configure
{
public static $configArray = array();

public static function loadConfig($configSource)
{
    # Explicitly turn this into an array.
    $configSource=(array)$configSource;

    # Loop through the array.
    foreach($configSource as $configFileName)
    {
        $config=require_once $configFileName;

        if (empty(self::$configArray)) {
            self::$configArray = $config;
        } else {
            foreach ($config as $key => $value) {
                self::$configArray[$key] = $value;
            }
        }
        unset($config);
    }

    return self::$configArray;
}
}
  

Обновление для нескольких похожих ключей:

 class Configure
{
public static $configArray = array();

public static function loadConfig($configSource)
{
    # Explicitly turn this into an array.
    $configSource=(array)$configSource;

    # Loop through the array.
    foreach($configSource as $configFileName)
    {
        $config=require_once $configFileName;

        if (empty(self::$configArray)) {
            self::$configArray = $config;
        } else {
            self::$configArray = array_merge_recursive(self::$configArray, $config);
        }
        unset($config);
    }
    return self::$configArray;
}
}
  

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

1. Спасибо, но это делает то же самое, что array_merge()

2. Теперь я увидел, что у вас есть несколько похожих ключей… Что ж, я обновил свой ответ.

3. Ах, array_merge_recursive() , отлично. Никогда раньше не использовал эту функцию. Работает.

4. Единственная проблема в том, что я не могу использовать оба Configure::loadConfig() вызова одновременно. Выдает ошибку: «Предупреждение: array_merge_recursive(): Аргумент # 2 не является массивом». $config=require_once $configFileName; возвращает boolean true во время второго вызова.

5. Либо вы преобразуете его в array, либо проверяете, является ли это массивом, если нет, вы добавляете значение в только что созданный массив, чтобы передать его в качестве второго аргумента. Если вы вызываете loadConfig несколько раз, почему он статичен?