2012-06-27 28 views
0

我有一個字符串($ c),其中包含逗號分隔的設置列表。某些設置是獨立的,而其他設置需要使用等號分隔的子設置。如何在分隔符爲可選時將字符串解析爲多維數組

實施例:

$c = "title,author,tax=taxonomy_A,tax=taxonomy_B,date"; 

我需要解析此字符串成多維陣列($列),其輸出是這樣的:

$columns = array(
    [0] => array('title', ''), 
    [1] => array('author', ''), 
    [2] => array('tax', 'taxonomy_A'), 
    [3] => array('tax', 'taxonomy_B'), 
    [4] => array('date', '') 
) 

我曾嘗試這樣的:

 $c = "title,author,tax=taxonomy_A,tax=taxonomy_B,meta=custom_field_key"; 
    $c = explode(',', $c); 
    $columns = array(explode('=', $c)); 

但是,這只是返回這個:

$columns = array(
    [0] => array('Array') 
) 

我在這裏錯過了什麼?第二個爆炸應該用另一個函數替換嗎?

在此先感謝!

回答

2
foreach(explode(',', "title,author,tax=taxonomy_A,tax=taxonomy_B,date") as $item) 
     $items[] = array_pad(explode('=', $item), 2, ''); 
+0

非常優雅...這是我會用的一個。太感謝了! –

1

你需要循環的第一爆炸後做第二個:

$c = "title,author,tax=taxonomy_A,tax=taxonomy_B,meta=custom_field_key"; 
$arr = explode(',', $c); 

$result = array(); 
foreach($arr as $a) { 
    array_push($result, explode('=', $a)); 
} 

print_r($result); 
+0

謝謝你的快速反應。我使用了Parahat的解決方案,但也非常感謝您的幫助! –

0

在你的代碼,你不申請第二個爆炸到陣列中的每個元素,但只是一次整個數組對象。這會導致數組轉換爲字符串「Array」,然後運行到explode()並導致輸出。

相反,你可以使用array_map()PHP docu):

function filterArr($value) { 
    return explode('=', $value) 
} 

$c = "title,author,tax=taxonomy_A,tax=taxonomy_B,meta=custom_field_key"; 
$c = explode(',', $c); 
$c = array_map("filterArr", $c); 
+0

感謝您的明確解釋。我使用了Parahat的解決方案,但也非常感謝您的幫助! –