Я пытаюсь создать ассоциативный массив в PHP динамично и не совсем разбираюсь в своей стратегии. В основном я хочу вставить значение на определенной глубине в структуре массива, например:
$array['first']['second']['third'] = $val;
Теперь, вещь, я не уверен, доступна ли та глубина, и если это не, я хочу создать ключи (и массивы) для каждого уровня и наконец вставить значение на корректном уровне.
Так как я делаю это довольно много в моем коде, я стал усталым от выполнения целого набора "array_key_exists", таким образом, я хотел сделать функцию, которая создает массив для меня, учитывая список ключей уровня. Любая справка на хорошей стратегии этого ценится. Я уверен, что существует довольно простой путь, я просто не получаю его...
php не обвиняет вас, если вы делаете это просто так
$array['first']['second']['third'] = $val;
print_r($array);
если вы не хотите, чтобы ваши ключи были жестко закодированы, вот гибкое решение
/// locate or create element by $path and set its value to $value
/// $path is either an array of keys, or a delimited string
function array_set(&$a, $path, $value) {
if(!is_array($path))
$path = explode($path[0], substr($path, 1));
$key = array_pop($path);
foreach($path as $k) {
if(!isset($a[$k]))
$a[$k] = array();
$a = &$a[$k];
}
$a[$key ? $key : count($a)] = $value;
}
// example:
$x = array();
array_set($x, "/foo/bar/baz", 123);
array_set($x, "/foo/bar/quux", 456);
array_set($x, array('foo', 'bah'), 789);
Создайте такую функцию, как:
function insert_into(&$array, array $keys, $value) {
$last = array_pop($keys);
foreach($keys as $key) {
if(!array_key_exists($key, $array) ||
array_key_exists($key, $array) && !is_array($array[$key])) {
$array[$key] = array();
}
$array = &$array[$key];
}
$array[$last] = $value;
}
Использование:
$a = array();
insert_into($a, array('a', 'b', 'c'), 1);
print_r($a);
Результат:
Array
(
[a] => Array
(
[b] => Array
(
[c] => 1
)
)
)
Это сложно, вам нужно будет работать со ссылками (или с рекурсией, но я выбрал ссылки здесь):
# Provide as many arguments as you like:
# createNestedArray($array, 'key1', 'key2', etc.)
function createNestedArray(&$array) {
$arrayCopy = &$array;
$args = func_get_args();
array_shift($args);
while (($key = array_shift($args)) !== false) {
$arrayCopy[$key] = array();
$arrayCopy = &$arrayCopy[$key];
}
}