PHP数组提取

时间:2010-12-13 14:23:53

标签: php html arrays

我有一个查询字符串:

"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

请帮帮我..

5 个答案:

答案 0 :(得分: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;

故事的寓意:总是初始化你的变量 ......

答案 1 :(得分:1)

为什么不使用parse_str? (假设您正在做的是解析GET参数字符串的典型情况)。

答案 2 :(得分:0)

您可以更改查询字符串吗?如果是这样,您可能希望查看使用数组。 E.g。

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)

答案 3 :(得分: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;

无论如何,我建议你总是使用数组作为数组中的值持有者,以使你的结构更加静态。

答案 4 :(得分: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>";