Я пытаюсь построить ассоциативный массив в 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);
Ouput:
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]; } }
<?php function setElements(&$a, array $path = [], $values = []) { if (!is_array($path)) { $path = explode($path[0], substr($path, 1)); } $path = "[ '" . join("' ][ '", $path) . "' ]"; $code =<<<CODE if(!isset(\$a{$path})){ \$a{$path} = []; } return \$a{$path}[] = \$values; CODE; return eval($code); } $a = []; setElements($a, [1,2], 'xxx'); setElements($a, [1,2,3], 233); setElements($a, [1,2,4], 'AAA'); setElements($a, [1,2,3,4], 555); print_r($a);
Вывод
Array ( [1] => Array ( [2] => Array ( [0] => xxx [3] => Array ( [0] => 233 [4] => Array ( [0] => 555 ) ) [4] => Array ( [0] => AAA ) ) ) )
Вы должны проверить это здесь http://sandbox.onlinephpfunctions.com/