如何从PHP中的字符串创建多维数组?

时间:2011-02-07 11:02:25

标签: php arrays

所以我的问题是:

  • 我想从字符串创建嵌套数组作为参考。
  • 我的字符串是"res[0]['links'][0]"
  • 所以我想创建数组$res['0']['links']['0']

我试过了:

$result = "res[0]['links'][0]";
$$result = array("id"=>'1',"class"=>'3');
$result = "res[0]['links'][1]";
$$result = array("id"=>'3',"class"=>'9');

当print_r($ res) 我明白了:

<b>Notice</b>:  Undefined variable: res in <b>/home/fanbase/domains/fanbase.sportbase.pl/public_html/index.php</b> on line <b>45</b>

我需要看看:

Array
(
    [0] => Array
        (
            [links] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [class] => 3
                        )

                )

        )
    [1] => Array
        (
            [links] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [class] => 9
                        )

                )

        )

)

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

所以你有一个数组结构的描述,以及填充它的东西。这是可行的,例如:

function array_create(&$target, $desc, $fill) {

    preg_match_all("/[^\[\]']+/", $desc, $uu);
       // unoptimized, always uses strings

    foreach ($uu[0] as $sub) {
        if (! isset($target[$sub])) {
             $target[$sub] = array();
        }
        $target = & $target[$sub];
    }
    $target = $fill;
}

array_create( $res, "[0]['links'][0]", array("id"=>'1',"class"=>'3') );
array_create( $res, "[0]['links'][1]", array("id"=>'3',"class"=>'9') );

注意数组名称本身不是结构描述符的一部分。但理论上你可以保留它。而是使用array_create()变量调用$tmp函数,然后调用它extract()以获得所需效果:

array_create($tmp, "res[0][links][0]", array(1,2,3,4,5));
extract($tmp);

另一个懒惰的解决方案是在将数组描述与数据数组组合为URL编码字符串的循环之后使用str_parse。

答案 1 :(得分:1)

我有一个非常愚蠢的方法,你可以试试这个:-) 假设你的字符串是"res[0]['links'][0]"首先在其中附加$然后放入eval命令,它会真的让你震惊。请遵循以下示例

$tmp = '$'.'res[0]['links'][0]'.'= array()';

eval($tmp);

现在您可以使用数组$res

100%的解决方法和: - )

`

答案 2 :(得分:0)

$res = array();
$res[0]['links'][0] = array("id"=>'1',"class"=>'3');
$res[0]['links'][0] = array("id"=>'3',"class"=>'9');

print_r($res);

但首先阅读评论并首先了解数组。

答案 3 :(得分:0)

除了mario的回答之外,我还使用了php.net注释中的另一个函数来组合输入数组(从jquery形式的serializeArray输出):

[2] => Array
    (
        [name] => apple[color]
        [value] => red
    )

[3] => Array
    (
        [name] => appleSeeds[27][genome]
        [value] => 201
    )

[4] => Array
    (
        [name] => appleSeeds[27][age]
        [value] => 2 weeks
    )

[5] => Array
    (
        [name] => apple[age]
        [value] => 3 weeks
    )

[6] => Array
    (
        [name] => appleSeeds[29][genome]
        [value] => 103
    )

[7] => Array
    (
        [name] => appleSeeds[29][age]
        [value] => 2.2 weeks
    )

Array
(
    [apple] => Array
        (
            [color] => red
            [age] => 3 weeks
        )
    [appleSeeds] => Array
        (
            [27] => Array
                (
                    [genome] => 201
                    [age] => 2 weeks
                )
            [29] => Array
                (
                    [genome] => 103
                    [age] => 2.2 weeks
                )
        )
)

这允许维护数字键,而不增加array_merge的附加值。所以,我使用了这样的序列:

function MergeArrays($Arr1, $Arr2) {
    foreach($Arr2 as $key => $Value) {
        if(array_key_exists($key, $Arr1) && is_array($Value)) {
              $Arr1[$key] = MergeArrays($Arr1[$key], $Arr2[$key]);
        }
        else { $Arr1[$key] = $Value; }
    }
    return $Arr1;
}
function array_create(&$target, $desc, $fill) {
    preg_match_all("/[^\[\]']+/", $desc, $uu);
    foreach ($uu[0] as $sub) {
        if (! isset($target[$sub])) {
              $target[$sub] = array();
        }
        $target = & $target[$sub];
    }
    $target = $fill;
}
$input = $_POST['formData'];
$result = array();
foreach ($input as $k => $v) {
    $sub = array();
    array_create($sub, $v['name'], $v['value']);
    $result = MergeArrays($result, $sub);
}