Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何构建一个复杂的URL/提要,将内部选项封装在括号中?_Php_Url_Mochi - Fatal编程技术网

Php 如何构建一个复杂的URL/提要,将内部选项封装在括号中?

Php 如何构建一个复杂的URL/提要,将内部选项封装在括号中?,php,url,mochi,Php,Url,Mochi,我正在尝试构建一个用于连接到api的提要生成器。我尝试连接到的API以以下格式构建URL: http://the.apiurl.com/f/query/?q=((((((rating%3A%3E%3D3)%20and%20rev_enabled)%20and%20not%20tags%3Arandomtag)%20and%20languages%3Aen)%20and%20this_enabled)%20and%20that_enabled)%20and%20this_also_enabled&

我正在尝试构建一个用于连接到api的提要生成器。我尝试连接到的API以以下格式构建URL:

http://the.apiurl.com/f/query/?q=((((((rating%3A%3E%3D3)%20and%20rev_enabled)%20and%20not%20tags%3Arandomtag)%20and%20languages%3Aen)%20and%20this_enabled)%20and%20that_enabled)%20and%20this_also_enabled&_id=xxxx&limit=100
如您所见,内部提要选项用括号括起来。如果您要拉出其中一个内部选项,您仍然会留下其他必须用括号括起来的选项吗

是否有一些PHP绝地武士的思维技巧可以优雅地实现这一最终结果?还是我必须简单地构建一个长得离谱的if/else/ifelse循环


谢谢

我花了一些时间来解决这个问题。我能想出的最好的办法是在下面。基本上,该函数接受一个填充了键/值对的数组作为必要的参数。它首先循环遍历参数以查找总计数,然后在前端应用必要的括号。然后,它通过一系列循环解析参数,并根据需要附加它们

该解决方案是特定于mochifeedapi的,但是如果您对其稍加调整,可以在其他方面使用它

// Accepts: $params (array) - An array which contains all of the filter options we are trying to account for.
function process_feed($params=null) {

    // Grab our feed's base URL
    $url = 'http://the.apiurl.com/f/query/?q=';

    // The items stored in this array can be set to a boolean value (true or false)
    $bool_queries = array('rev_enabled', 'this_enabled', 'this_also_enabled');

    // The items stored in this array can be set to an integer, string, etc...
    $return_queries = array('languages', 'omit_tags', 'tags', 'category', 'limit');

    // Grab the parameter/filter count
    $size = count($params);

    // We have enough filters to go custom
    if ($size > 1) {

        // Loop through and place the appropriate amount of opening parens
        for ($x = 0; $x < ($size-1); $x++) { $url .= '('; }

        $i = 0;

        foreach ($params as $key=>$value) {

            if ($i < ($size-1)) {

                if (in_array($key, $bool_queries)) {
                    $url .= $key.')%20and%20';
                } else {

                    // special NOT case
                    if ($key == 'omit_tags') {
                        $url .= 'not%20tags%3A'.$value.')%20and%20';
                    } else {
                        $url .= $key.'%3A'.$value.')%20and%20';
                    }
                }

            } else {
                if (in_array($key, $bool_queries)) {
                    $url .= $key;
                } else {
                    // special NOT case
                    if ($key == 'omit_tags') {
                        $url .= 'not%20tags%3A'.$value;
                    } else {
                        $url .= $key.'%3A'.$value;
                    }
                }
            }

            $i++;
        }

    } else if ($size == 1) {

        foreach ($params as $key=>$value) {
            if (in_array($key, $bool_queries)) {
                $url .= $key;
            } else {
                // special NOT case
                if ($key == 'omit_tags') {
                    $url .= 'not%20tags%3A'.$value;
                } else { 
                    $url .= $key.'%3A'.$value;
                }
            }
        }
    }

    if (isset($params['limit'])) {
        $url .= '&partner_id=' . $our_partner_key . '&limit=' . $limit;
    } else {
        $url .= '&partner_id=' . $our_partner_key;
    }

    if(isset($url)) {
        return $url;
    }

    return false;
}
//接受:$params(array)-一个包含我们试图说明的所有筛选器选项的数组。
函数进程_feed($params=null){
//获取我们提要的基本URL
$url='1http://the.apiurl.com/f/query/?q=';
//存储在此数组中的项可以设置为布尔值(true或false)
$bool_querys=array('rev_enabled'、'this_enabled'、'this_allow_enabled');
//此数组中存储的项可以设置为整数、字符串等。。。
$return_querys=array('languages','ommit_tags','tags','category','limit');
//获取参数/过滤器计数
$size=计数($params);
//我们有足够的过滤器来定制
如果($size>1){
//循环并放置适当数量的开口板
对于($x=0;$x<($size-1);$x++){$url.='(';}
$i=0;
foreach($key=>$value的参数){
如果($i<($size-1)){
if(在数组中($key,$bool_查询)){
$url.=$key.')%20和%20';
}否则{
//特例
如果($key==“省略标签”){
$url.=“不是%20标记%3A”。$value.)%20和%20';
}否则{
$url.=$key.'%3A.$value.')%20和%20';
}
}
}否则{
if(在数组中($key,$bool_查询)){
$url.=$key;
}否则{
//特例
如果($key==“省略标签”){
$url.=“不是%20tags%3A”。$value;
}否则{
$url.=$key.'%3A'.$value;
}
}
}
$i++;
}
}else如果($size==1){
foreach($key=>$value的参数){
if(在数组中($key,$bool_查询)){
$url.=$key;
}否则{
//特例
如果($key==“省略标签”){
$url.=“不是%20tags%3A”。$value;
}否则{
$url.=$key.'%3A'.$value;
}
}
}
}
如果(isset($params['limit'])){
$url.='&partner\u id='.$our\u partner\u key.&limit='.$limit;
}否则{
$url.='&partner_id='.$our_partner_key;
}
如果(isset($url)){
返回$url;
}
返回false;
}