将ODATA查询uri解析为PHP数组

时间:2013-01-03 19:17:38

标签: php parsing query-string odata string-parsing

我有一个客户端调用我用PHP编写的Web服务。在调用它时,客户端应用程序会给它一个小的查询字符串。我想将此字符串解析为数组。因此,使用url中的给定示例查询,我已经开始这样做了:

Url: $select=substringof("customer", tolower(toupper(bla))),test$filter=Name%20eq%20'test'%20and%20toupper(Name)$skip=10$top=2$orderby=day(time)%20desc

<?php
function parseOdataRequest($request)
{
    $expression = array();

    // Fetch parameters
    $params = explode('$', $request);

    // Leave empty parameter name alone
    unset($params[0]);
    $params = array_values($params);

    // Check every parameter
    for($i = 0; $i < count($params); $i++)
    {
        // every parameter has to be a name=value pair!
        $param = explode('=', $params[$i]);         


        if(!(count($param) == 2))
            throw new Exception("Invalid parameter. Providence must be name=value");


        // Validate parameter name
        if(in_array($param[0], $this->validParams))
        {                           
            $parseParam = 'parse' . ucfirst(strtolower($param[0]));
            $expression[$param[0]] = $this->$parseParam($param[1]);             
        }
        else            
            throw new Exception("Unkown parameter '" . $param[0] . "'");            
    }
    var_dump($expression);
}
?>

结果,我有以下$表达式:

array (size=5)
  'select' => null
  'filter' => null
  'skip' => null
  'top' => null
  'orderby' => null

我想要的是以下内容:

 array (size=5)
  'select' => 
    array (size=2)
      'substringof' => 
        array (size=2)
          0 => string 'customer' (length=8)
          'tolower' => 
            array (size=1)
              'toupper' => 
                array (size=1)
                  0 => string 'bla' (length=3)
      0 => string 'test' (length=4)
  'filter' => 
    array (size=3)
      0 => 
        array (size=3)
          0 => string 'Name' (length=4)
          1 => string 'eq' (length=2)
          2 => string ''test'' (length=6)
      1 => string 'and' (length=3)
      2 => 
        array (size=3)
          'toupper' => 
            array (size=1)
              0 => string 'Name' (length=4)
          0 => string 'eq' (length=2)
          1 => string ''TEST'' (length=6)
  'skip' => int 10
  'top' => int 2
  'order' => 
    array (size=1)
      0 => 
        array (size=2)
          'day' => 
            array (size=1)
              0 => string 'time' (length=4)
          0 => string 'desc' (length=4)

我尝试了不同的东西,但从未成功过。我会很感激像解决这个问题的方法。

0 个答案:

没有答案