2010-08-02 98 views
1

我試圖從字符串(從$ _GET,輸入被驗證,但在本例中沒有收到)中創建一個多維數組。每個' - '將指示多維數組中的一個級別。可變深度多維數組的字符串

值可以像這樣(任何形式,只要' - '存在於鍵之間)。值的數組可以映射到多維數組中的任何深度。

$array = array(
    'page-title' => 'Title of a page', 
    'page-url' => 'http://www.mypage.com', 
    'meta-page-author' => 'Some guy', 
    'meta-page-created' => 'some timestamp' 
); 

我已經嘗試了不同的解決方案,但直到現在唯一的工作是初始循環和提取鍵。

foreach ($array as $key => $value) { 
    if (strpos($key, '-') !== false) { 
    $keyArray = explode('-', $key); 
    // ?? 
    } 
} 

輸出我希望的,應該是這樣的:

array(
    'page' => array(
     'title' => 'Title of a page', 
     'url' => 'http://www.mypage.com' 
), 
    'meta' => array(
     'page' => array(
     'author' => 'Some guy', 
     'created' => 'some timestamp' 
     ) 
) 
); 
+1

爲什麼不根本擺脫這個解析併發送一個數組本身?序列化或json_encoded當然 – 2010-08-02 12:52:09

+0

數據需要從第三方網站使用1x1圖像捕獲。所以我需要使用較小的變量來做到這一點。如果它符合我的要求,我可以使用cHao的數組建議。 – 2010-08-02 16:27:18

回答

4

像這樣的東西應該工作:

<?php 
$array = array(
    'page-title' => 'Title of a page', 
    'page-url' => 'http://www.mypage.com', 
    'meta-page-author' => 'Some guy', 
    'meta-page-created' => 'some timestamp' 
); 

$result = array(); 

foreach ($array as $key => $value) { 
    $keys = strpos($key, '-') !== false ? explode('-', $key) : array($key); 
    $ptr = &$result; 
    foreach ($keys as $k) { 
     if (!isset($ptr[$k])) { 
      $ptr[$k] = array(); 
     } 
     $ptr = &$ptr[$k]; 
    } 
    if (empty($ptr)) { 
     $ptr = $value; 
    } else { 
     $ptr[] = $value; 
    } 
} 

print_r($result); 

我所做的只是像炸開你的鑰匙你在做。如果數組不存在,我然後通過它們創建一個新的數組。使用參考我保存當前點在陣列中。然後,一旦我擊中了最後一個鍵,我分配了該值。希望這可以幫助。

編輯:基於超的建議,我改變了

$keys = strpos($key, '-') !== false ? explode('-', $key) : $key; 

$keys = strpos($key, '-') !== false ? explode('-', $key) : array($key); 

,以防止在foreach失敗。

編輯2:我改變

$ptr = $value; 

if (empty($ptr)) { 
    $ptr = $value; 
} else { 
    $ptr[] = $value; 
} 

處理樣病例:

$array = array(
    'page-title' => 'Title of a page', 
    'page-url' => 'http://www.mypage.com', 
    'meta-page-author' => 'Some guy', 
    'meta-page-created' => 'some timestamp', 
    'page' => 'foo' 
); 
+0

很好!我有同樣的事情。怕你打敗我。現在沒有意義發佈我的解決方案...;)無論如何gj – thecodeassassin 2010-08-02 12:31:26

+0

我在考慮'$ keys ='行,最後,':$ key;'應該是':array($ key);'。那樣:?的兩個分支都返回一個數組。 – cHao 2010-08-02 12:35:06

+0

像魅力一樣工作,謝謝:) – 2010-08-02 13:12:03

1

只是讓你知道,PHP,可向接受整個大陣這樣。如果您將表單元素命名爲'somename [page] [title]',那麼當表單返回時,您應該看到它們已經以$ _GET中的數組形式排列。

如果你有你的心臟上的當前命名方案設置,但...

$result = array(); 

foreach ($array as $key => $value) { 
    $current =& $result; 
    if (strpos($key, '-') !== false) { 
     $keyArray = explode('-', $key); 
     $bottomKey = array_pop($keyArray); 
     foreach ($keyArray as $subKey) { 
      if (!isset($current[$subKey])) 
       $current[$subKey] = array(); 
      $current =& $current[$subKey]; 
     } 
    } else { 
     $bottomKey = $key; 
    } 

    $current[$bottomKey] = $value; 
} 
0
<?php 
$array = array(
    'page-title' => 'Title of a page', 
    'page-url' => 'http://www.mypage.com', 
    'meta-page-author' => 'Some guy', 
    'meta-page-created' => 'some timestamp' 
); 
$result = array(); 
foreach ($array as $key => $value) { 
    if (strpos($key, '-') !== false) { 
     $ak = "result['" . str_replace('-', '\'][\'', $key) . "'] = \"".$value."\""; 
     eval('$'.$ak.';'); 
    } 
} 
var_dump($result); 
?> 

希望幫助