如何在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);
}