2011-02-07 56 views
0

所以我的问题是:
如何从PHP中的字符串创建多维数组?

  • 我想创建的字符串作为参考嵌套数组。
  • 我的字符串是"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($水库) 我看到:

<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 
         ) 

       ) 

     ) 

) 

感谢您的任何帮助。

+5

你显然不知道PHP数组(和变量)是如何工作的。在继续编码之前,如果你阅读了一本书或者至少一本教程,并且要求我们为你编写微不足道的代码(而不是像这样的Q&A网站那样的具体问题),那将是最好的。一个很好的资源可能是http://php.net/manual/en/language.types.array.php – AlexanderMP 2011-02-07 11:05:27

+1

你想print_r $ res或$ result? – Shrinath 2011-02-07 11:05:45

+2

为什么你想从一个字符串创建一个数组?也许最好解释一下你在高层做什么,因为它可能会有人可以提出一个更好的方法来做这件事(即不会导致你在一个字符串中有一个数组) – Leigh 2011-02-07 11:09:17

回答

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使用串。

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

print_r($res); 

但首先阅读注释并首先了解数组。

1

我有这是一个非常愚蠢的办法,你可以试试这个:-) 假设你的字符串"res[0]['links'][0]"首先附加在这个$然后放在eval命令,它会真正震撼你。按照下面的例子

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

eval($tmp);

现在你可以使用你的阵列$res

100%的解决办法,并:-)

`

0

除了马里奥回答,我使用了另一个来自php的函数。净的评论,一起,以使输入阵列(从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); 
}