2012-09-22 101 views
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(';', ':', ','); 

此數組中的分隔符的順序將決定查詢字符串的解析順序。

有人有這樣的方便嗎?

問候,

馬克

+1

...你到目前爲止嘗試過什麼? –

回答

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

我沒有測試這一點,但我希望得到我要去的地方的想法...

這可以被更新創建一個函數,接受一個分隔符,使其真正遞歸,以便在一個循環內您可以調用此函數,而不是有一個循環內...

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; 

    } 

有很多重複的,我想擺脫掉。此外,它還不是很有活力!