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

なぜ最初の2つのペアが? &の代わりに? – Nedec

+0

値 '$ k'はどこに設定されていますか? –

+0

'print_r($ arr)'を実行して、構築が実際に正しいかどうかを確認します。プリントアウトコードが少し不完全に見えます。 – poke

答えて

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

5

あなたのエコーコードで$eを初期化することはありません。したがって、リセットするのではなく、常に新しい値を追加するだけです。 parse_strを使用しないのはなぜ常にあなたの変数を初期化 ...

+0

ええ...あなたは正しいです!初心者の間違い – morowind

1

$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; 

話の教訓:これを試してみてください? (あなたがやっていることは、GET引数文字列を解析するのが典型的だと仮定して)。

+0

それは同じではありません(私は同じことを言うつもりでしたが、違いを実現しました)。基本的には '[]'を必要とせずに配列の構文をシミュレートします。 'parse_str'では、同じキーが上書きされるので、' foo = bar&foo = baz'は 'foo = baz'になります。しかし、彼の実装は 'foo [] = bar&foo [] = baz'に変換します。ちょっと違って(そして仕様に合わない)、それは違う... – ircmaxell

+0

ああ、良いキャッチ。これらの重複をキャッチして調整し、ネイティブ関数を解析するほうが簡単です。私はそれぞれ自分のことを推測します。 –

+0

私はこの問題を自分で解決しなければならないとすれば、私はおそらくそうするでしょう。あなたはまだ有効なクエリ文字列を思いついているので、ネイティブ関数が与える復号化の利点があります。 – ircmaxell

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

関連する問題