在PHP中动态创建/插入关联数组

时间:2010-03-15 13:24:45

标签: php associative-array

我正在尝试动态地在PHP中构建一个关联数组,而不是让我的策略正确。基本上,我想在数组结构中的某个深度插入一个值,例如:

$array['first']['second']['third'] = $val;

现在,问题是,我不确定该深度是否可用,如果不是,我想为每个级别创建键(和数组),最后将值插入正确的级别

由于我在代码中做了很多这样的事情,我厌倦了做一大堆“array_key_exists”,所以我想做一个为我构建数组的函数,给出一个关键字列表。任何有关良好战略的帮助都表示赞赏。我确信有一种非常简单的方法,我只是没有得到它......

4 个答案:

答案 0 :(得分:8)

如果你这样做的话,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);

答案 1 :(得分:3)

创建一个类似的函数:

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
                )

        )

)

答案 2 :(得分:0)

这很棘手,你需要使用引用(或递归,但我 选择参考文献):

# 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];
    }
}

答案 3 :(得分:0)

<?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/