1

クエリ文字列を多次元配列に解析する関数が必要です。クエリ文字列は次のようになります。

?fields=incidents:(id,shortdescription,action,request);people:(unid,name)&format=json

返される配列は次のようになります。

array(
   'fields' => array(
      'incidents' => array(
         'id',
         'shortdescription',
         'action',
         'request'
      ),
      'people' => array(
         'unid',
         'name'
      ),
   ),
   'format' => 'json'
);

セパレーターを動的にしたいので、次のような配列に配置します。

$separators = array(';', ':', ',');

この配列内の区切り文字の順序によって、クエリ文字列が解析される順序が決まります。

誰かがこのような便利なものを持っていますか?

よろしく、

マーク

4

2 に答える 2

0

私自身、私はこれを思いつきました:

protected static function split( $value, $sep = ',' )
{   
    if ( str_contains( $value, $sep ) ) 
        $value = explode( $sep, $value );

    return $value;
} 

protected static function multi_split( $value )
    {
        $arr = array();

        // Do we have multiple models?
        $parts = static::split( $value, '+' );        
        if ( count( $parts ) > 1 ) {
            foreach( $parts as $part ) {
                $models = static::split( $part, ':' ); 
                if ( count( $models ) > 1 ) {
                    $fields = static::split( trim($models[1], '()'), ',' );                   
                    $arr[$models[0]] = $fields;   
                }   
            }             

            return $arr;  
        } 

        // Do we have a single model?
        $parts = static::split( $value, ':' ); 
        if ( count( $parts ) > 1 ) {
            $fields = static::split( trim($parts[1], '()'), ',' );               
            $arr[$parts[0]] = $fields;

            return $arr;  
        } 

        // Do we have a comma-separated param?
        $parts = static::split( $value, ',' );
        if ( count( $parts ) > 1 ) 
            return $parts; 

        // Do we have a string param?
        return $value;

    }

やめたいと思う繰り返しがたくさんあります。また、まだあまり動的ではありません。

于 2012-09-22T14:54:04.120 に答える
0

開始するには:

$final = array();
$keys = explode("&", $_SERVER['QUERY_STRING']);
foreach ($keys as $key => $value) {

    $final[$key] = $value;

    $child = explode(";", $value);
    foreach ($child as $key2 => $value2) {
        $final[$key][$key2] = array();

        $subchild = explode(":", $value2);
        foreach ($subchild as $key3 => $value3) {
            $subsubchild = explode(",", $value3);
            $final[$key][$key2][$key3] = $subsubchild;
        }
    }
}

私はこれをテストしませんでしたが、うまくいけば、どこに行くのかがわかります...

これを更新して、デリミタを受け入れる関数を作成して真に再帰的にすることができるため、ループ内のループ内にループを含めるのではなく、この関数を呼び出すことができます...

于 2012-09-22T13:32:35.467 に答える