2010-12-13 94 views
0

我有一個查詢字符串:PHP數組提取

"condition=good;condition=not-good&features=ABS&features=ESP&features=ENT&brand=Honda&model=Traffic" 

* 請注意重複的參數

我使用此功能轉換和 - 獲取也重複鍵 - 陣列:

function proper_parse_str($str) { 
    # result array 
    $arr = array(); 

    # split on outer delimiter 
    $pairs = explode('&', $str); 

    # loop through each pair 
    foreach ($pairs as $i) { 
    # split into name and value 
    list($name,$value) = explode('=', $i, 2); 

    # if name already exists 
    if(isset($arr[$name])) { 
     # stick multiple values into an array 
     if(is_array($arr[$name])) { 
     $arr[$name][] = $value; 
     } 
     else { 
     $arr[$name] = array($arr[$name], $value); 
     } 
    } 
    # otherwise, simply stick it in a scalar 
    else { 
     $arr[$name] = $value; 
    } 
    } 

    # return result array 
    return $arr; 
} 

爲了回顯html我使用這個:

//using the above function 
$array=proper_parse_str($string); 
foreach ($array as $key => $value) { 
    if (is_array($value)) { 
     foreach($value as $t) { 
      $e .="<li>".$t."</li>"; 
     } 
     $mkey .="<ul><li><b>".$key."</b><ul>".$e."</ul></li></ul>"; 
    } else { 
     $tt ="<li>".$value."</li>"; 
     $mkey .="<ul><li><b>".$key."</b><ul>".$tt."</ul></li></ul>"; 
    } 
} 
echo $mkey; 

獲得:

Condition 
    good 
    not-good 
Features 
    ABS 
    ESP 
    ENT 
Brand 
    Honda 
Model 
    Traffic 

,但我得到:

Condition 
    good 
    not-good 
Features 
    **good 
    **not-good 
    ABS 
    ESP 
    ENT 
Brand 
    Honda 
Model 
    Traffic 

請幫助我..

+0

爲什麼前兩對由a分開;代替 &? – Nedec 2010-12-13 14:27:35

+0

設置值'$ k'在哪裏? – 2010-12-13 14:28:39

+0

做一個'print_r($ arr)'來檢查你的構造是否確實是正確的。打印輸出代碼看起來有點不完整。 – poke 2010-12-13 14:29:33

回答

0
function proper_parse_str($str) { 
    # result array 
    $arr = array(); 

    # split on outer delimiter 
    $pairs = explode('&', $str); 

    # loop through each pair 
    foreach ($pairs as $i) { 
    # split into name and value 
    list($name,$value) = explode('=', $i, 2); 
    $arr[$name][] = $value; 
    } 

    # return result array 
    return $arr; 
} 
//using the above function 
     $array=proper_parse_str("condition=good&condition=not-good&features=ABS&features=ESP&features=ENT&brand=Honda&model=Traffic"); 
echo "<ul>"; 
foreach ($array as $key => $value) 
{ 
    echo "<li>$key<ol>"; 
    foreach ($value as $k => $v) 
    { 
     echo "<li>$v</li>"; 
    } 
    echo "</ol></li>"; 
} 
echo "</ul>"; 
+0

曼尼聰明/專家傢伙在這裏...謝謝這個解決方案的作品。 – morowind 2010-12-13 18:04:38

5

你從來沒有在您的呼應代碼初始化$e。所以它總是會追加新的值而不是重置。試試這個:

$array=proper_parse_str($string); 
$mkey = ''; 
foreach ($array as $key => $value) { 
    if (is_array($value)) { 
     $e = ''; 
     foreach($value as $t){ 
      $e .="<li>".$t."</li>"; 
     } 
     $mkey .="<ul><li><b>".$k."</b><ul>".$e."</ul></li></ul>"; 
    } else {   
     $tt ="<li>".$value."</li>"; 
     $mkey .="<ul><li><b>".$key."</b><ul>".$tt."</ul></li></ul>"; 
    } 
} 
echo $mkey; 

這個故事的寓意是:總是初始化變量 ...

+0

是的......你說得對!初學者的錯誤 – morowind 2010-12-13 16:32:54

1

爲什麼不使用parse_str? (假設你正在做的是典型的解析GET參數字符串)。

+0

這是不一樣的(我會說同樣的事情,但後來意識到了這種差異)。基本上,這模擬了數組語法,而不需要'[]'。用'parse_str',相同的鍵覆蓋,所以'foo = bar&foo = baz'只會導致'foo = baz'。但他的實現將它轉換爲'foo [] = bar&foo [] = baz'。稍有不同(不符合規格),但它是不同的... – ircmaxell 2010-12-13 14:34:12

+0

啊,很好的接收。似乎更容易捕捉這些重複項並對其進行調整,然後使用本機函數進行解析。我想每個人都有自己的想法。 – 2010-12-13 14:36:56

+0

如果我必須自己解決這個問題,那麼這就是我可能會做的。這樣,你仍然想出有效的查詢字符串,並具有本地功能給出的解碼/等的好處... – ircmaxell 2010-12-13 14:42:37

0

你能改變你的查詢字符串嗎?如果是這樣,你可能想看看使用數組。例如。

condition[]=good&condition[]=not-good&features[]=ABS&features[]=ESP&features[]=ENT&brand[]=Honda&model[]=Traffic 

給出:

array 
    'condition' => 
    array 
     0 => string 'good' (length=4) 
     1 => string 'not-good' (length=8) 
    'features' => 
    array 
     0 => string 'ABS' (length=3) 
     1 => string 'ESP' (length=3) 
     2 => string 'ENT' (length=3) 
    'brand' => 
    array 
     0 => string 'Honda' (length=5) 
    'model' => 
    array 
     0 => string 'Traffic' (length=7) 
0

您可以使用數組加入做串產生一點更加簡單。

$mkey = ''; 
foreach (proper_parse_str($string) as $key => $value) 
{ 
    if (is_array($value)) 
     $value = implode('</li><li>', $value); 

    $mkey .= '<li><b>' . $key . '</b><ul><li>' . $value . '</li></ul></li>'; 
} 
echo $mkey; 

無論如何,我建議你總是使用數組作爲數組的持有者來使結構更加靜態。

+0

太棒了。非常感謝。我花了24小時與此... – morowind 2010-12-13 16:31:19