2011-02-07 52 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); 
}