2010-12-13 65 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