Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中从字符串创建多维数组?_Php_Arrays - Fatal编程技术网

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

如何在PHP中从字符串创建多维数组?,php,arrays,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'

所以我的问题是:

  • 我想从字符串创建嵌套数组作为引用。
  • 我的字符串是
    “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');
打印时($res) 我明白了:

谢谢你的帮助

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

print_r($res);

但是,先阅读评论,然后再了解数组。

这样您就有了对数组结构的描述,以及一些需要填充的内容。这在以下情况下是可行的:

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') );
请注意,数组名称本身不是结构描述符的一部分。但理论上你可以保留它。相反,使用
$tmp
变量调用
array\u create()
函数,然后调用
extract()
函数以达到所需的效果:

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

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

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

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

eval($tmp)

现在您可以使用数组
$res

100%解决方案和:-)


`

除了mario的答案之外,我还使用了php.net comments中的另一个函数,使输入数组(jquery表单序列化数组的输出)如下所示:

[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
    )
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);
}
进入

这允许维护数字键,而无需增加数组的追加。所以,我使用了如下顺序:

[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
    )
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);
}

要打印\r$res或$result?为什么要从字符串创建数组?也许最好在较高的层次上解释一下你想做什么,因为很可能有人可以建议一种更好的方法(即不会导致你在字符串中有一个数组的方法)这些字符串甚至与你想要在数组中的内容不一致:第二个$result肯定应该是“res[1]['links'][0]”而不是$result=“res[0]['links'][1]”你从哪里得到这样的字符串的?是的,这几乎是不好的。只有当这些构造源于配置文件等时,它才是可接受的。应用程序输入——即使经过精心筛选——也不应该在其中,即使是部分输入。然而,这仍然是为数不多的有效评估用途之一+1好极了!我在这个问题的另一个答案中添加了我的使用示例。
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);
}