#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 несколько раз, почему он статичен?