PHP-通过RFC1738编码自定义URL

PHP-通过RFC1738编码自定义URL,php,api,url,encoding,Php,Api,Url,Encoding,我试图从一个特定的API获取一些数据。如果我在API页面上进行测试运行,他们会将此url作为响应返回给我,以便我可以从那里获取API数据: (仅分类代码段) 基本上就是说:1,2,3,4,5,6,7,8,9,10,11,12 我有一个分类数组,也有12个元素 该数组如下所示: dd($this->categories) outputs: array:12 [▼ 0 => "1" 1 => "2" 2 => "3" 3 => "4" 4 =>

我试图从一个特定的API获取一些数据。如果我在API页面上进行测试运行,他们会将此url作为响应返回给我,以便我可以从那里获取API数据:

(仅分类代码段)

基本上就是说:1,2,3,4,5,6,7,8,9,10,11,12

我有一个分类数组,也有12个元素

该数组如下所示:

dd($this->categories) outputs:

array:12 [▼
  0 => "1"
  1 => "2"
  2 => "3"
  3 => "4"
  4 => "5"
  5 => "6"
  6 => "7"
  7 => "8"
  8 => "9"
  9 => "10"
  10 => "11"
  11 => "12"
]
&categories=0=1%2C1=2%2C2=3%2C3=4%2C4=5%2C5=6%2C6=7%2C7=8%2C8=9%2C9=10%2C10=11%2C11=12 
要从我的系统发出api请求,我调用的url必须具有与api测试相同的标准。然而,这就是我的URL的样子(仅分类片段)

代码段:

$categories = "&categories=" . rawurlencode(json_encode($this->categories));
如您所见,api测试的url片段比我的要短得多。我想那是因为编码

我首先尝试用将数组转换为json来解决这个问题,并对其使用了rawurlencode方法。但这并没有解决我的问题。我需要以同样的方式“转换”url,api会这样做

有人知道我如何解决这个问题吗

我发现:

我发现这个片段几乎解决了我的问题

$categories = "&categories=" . http_build_query($this->categories, null, "%2C", PHP_QUERY_RFC1738);
结果如下所示:

dd($this->categories) outputs:

array:12 [▼
  0 => "1"
  1 => "2"
  2 => "3"
  3 => "4"
  4 => "5"
  5 => "6"
  6 => "7"
  7 => "8"
  8 => "9"
  9 => "10"
  10 => "11"
  11 => "12"
]
&categories=0=1%2C1=2%2C2=3%2C3=4%2C4=5%2C5=6%2C6=7%2C7=8%2C8=9%2C9=10%2C10=11%2C11=12 

但是我真的不知道NE0从何而来,也不知道为什么每个数组元素后面总是有一个“=”字符如果你检查变量,你会发现URL编码与问题无关:

var_dump(rawurldecode('categories=%5B%221%22%2C%222%22%2C%223%22%2C%224%22%2C%225%22%2C%226%22%2C%227%22%2C%228%22%2C%229%22%2C%2210%22%2C%2211%22%2C%2212%22%5D'));
string(63)“类别=[“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“11”、“12]”
请比较:

$categories = array('1', '2', '3');
var_dump(json_encode($categories));
var_dump(implode(',', $categories));
string(13)“[“1”、“2”、“3”]
串(5)“1,2,3”

http\u build\u query()。您实际上没有任何复杂的结构,只有一个字符串变量。

这与URL编码无关。你不用原始的逗号分隔的整数列表,而是从一个JSON编码的字符串数组开始。
join(“,”,$this->categories)
–这就是你想要URL编码并插入到查询中的内容…谢谢CBrow,这非常有帮助:)请写一个答案,这样我就可以把它标记为正确:)我用join:)得到了答案,你说得对,http_build_query杀死了我的整个程序M:DSo,你能用我的答案修复它吗?