配列からクエリ文字列を作成するPHP関数


165

キーと値のペアの配列からクエリ文字列を作成するPHP関数の名前を探しています。注意してください、私はこれを行うために組み込みのPHP関数を探しています、自家製のものではありません(それはすべてグーグル検索が戻るようです)。1つあります。名前を覚えていなかったり、php.netで見つけられません。IIRCの名前はそれほど直観的ではありません。

回答:


312

あなたが探していhttp_build_query()ます。


これはPHP 5から入手はかなり新しい関数、である
Calmarius

15
この機能に注意してください!値がNULLのキーと値のペアは省略されます。echo http_build_query(array("foo"=>"bar","bar"=>null))のみが生成されますfoo=bar
cb0 2014

@ cb0これはブラウザでのフォーム送信と同様に機能し、空の入力フィールドは送信されたクエリに含まれません。
TJ L

1
@ceejayozええと、あなたは長い間それを知っていました...あなたの願いは叶いましたか?
Andrew、

21

ここに単純なphp4フレンドリーな実装があります:

/**
* Builds an http query string.
* @param array $query  // of key value pairs to be used in the query
* @return string       // http query string.
**/
function build_http_query( $query ){

    $query_array = array();

    foreach( $query as $key => $key_value ){

        $query_array[] = urlencode( $key ) . '=' . urlencode( $key_value );

    }

    return implode( '&', $query_array );

}

30
これはphp4バージョンです。
0x6A75616E

1
デコードを行うと、PHPはキーもパーセントデコードしたように見えます。ここでそれを行う価値があるのでしょうか?
cloudfeet 2013

@cloudfeetはそうするのが理にかなっているようです。指摘してくれてありがとう。
0x6A75616E 2013

2

@thatjuanの回答に加えて。
これのより互換性のあるPHP4バージョン:

if (!function_exists('http_build_query')) {
    if (!defined('PHP_QUERY_RFC1738')) {
        define('PHP_QUERY_RFC1738', 1);
    }
    if (!defined('PHP_QUERY_RFC3986')) {
        define('PHP_QUERY_RFC3986', 2);
    }
    function http_build_query($query_data, $numeric_prefix = '', $arg_separator = '&', $enc_type = PHP_QUERY_RFC1738)
    {
        $data = array();
        foreach ($query_data as $key => $value) {
            if (is_numeric($key)) {
                $key = $numeric_prefix . $key;
            }
            if (is_scalar($value)) {
                $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($key) : rawurlencode($key);
                $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($value) : rawurlencode($value);
                $data[] = "$k=$v";
            } else {
                foreach ($value as $sub_k => $val) {
                    $k = "$key[$sub_k]";
                    $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($k) : rawurlencode($k);
                    $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($val) : rawurlencode($val);
                    $data[] = "$k=$v";
                }
            }
        }
        return implode($arg_separator, $data);
    }
}

-2

この質問はかなり古く、PHPの場合、(現在)非常に人気のあるPHPフレームワークLaravelでこれを行う方法があります。

アプリケーションのパスのクエリ文字列をエンコードするには、ルート名を指定してから、route()ヘルパー関数を次のように使用します。

route('documents.list.', ['foo' => 'bar']);

結果は次のようになります。

http://localhost/documents/list?foo=bar

また、ルートにパスセグメントパラメータなどがある/documents/{id}場合は、必ずパラメータにもid引数を渡してroute()ください。そうでない場合、デフォルトで最初のパラメータの値が使用されます。


-3

Implodeは配列を文字列に結合しますが、SQLクエリを実行して値と値のペアを作成するには、独自の関数を作成する必要があります。


それを試しましたが、うまくいきません。キーと配列の値の両方を必要とするhttpクエリ文字列を作成しようとしていますが、implodeではこれを実行できません。
Robin Barnes、

2
わかりました。SQLクエリ文字列なのか、httpクエリ文字列なのかはわかりませんでした。
2008
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.