可以在 URL 中传递多个参数吗?
Possibility of passing multiple parameters in URL?
我在一个基于搜索的网站上工作,我正在尝试使用 SEO 友好的 URLs 来传递参数。
是否可以通过以下 URL 并在 CodeIgniter 中获取 URL?
http://www.example.com/search/prize/10/13/14.5/size/xl/2xl/color/black/white-grey/
我可以创建 URL,但我想获得 URL 值,例如 $prize = array("10","13","14.5")
、$size= array("xl","2xl")
和 $color = array("black","white-grey")
。
我尝试使用 uri_to_assoc()
功能,但没有用。我得到以下输出:
[price] => 10,
[13] => 14.5
...
这是错误的。
注意:我试过用$this->uri->segment(1)
等,但是在这种情况下,段位置是动态的
例如,用户可能只搜索
的价格,因此 URL 将更改为:
http://www.example.com/search/prize/10/size/xl/2xl/color/black/white-grey/
现在必须更改获取 size
的段位置。在这种情况下,我想要:
$prize = array("10");
$size = array("xl", "2xl");
$color = array("black", "white-grey");
我怎样才能做到这一点?
- 获取所有段
- 遍历它们,检查每个关键字,如
size
、color
等(创建白名单)
- 如果找到关键字,假设直到下一个关键字段或结尾的段值是该特定关键字的值(因此
xl
和 2xl
将表示大小,如果前面有关键字 size
,等等)
您使用的是非常规的 "friendly URI" 格式。通常,在传递参数时,只有一个标识符,然后是参数,例如/name/key/name/key/name/key
.
当您将正确的格式 /name/key/name/key/name/key
与 uri_to_assoc()
结合使用时,您将得到:
array(
'name' => 'key',
// etc...
)
但使用 /prize/1/2/3/size/s/m/l/color/black/white/grey
之类的东西会产生:
array(
'prize' => 1,
2 => 3,
'size' => 's',
'm' => 'l',
// etc...
)
哪个对你没用。
您将必须单独获取所有段并构建您的数组 foreach
:
$segments = $this->uri->segment_array();
$prize = array();
$size = array();
$color = array();
$curKey = '';
foreach ($segments as $seg) {
if (in_array($seg, array('prize', 'size', 'color'))) {
$curKey = $seg; continue;
}
if (!empty($curKey)) ${$curKey}[] = $seg;
}
// use $prize, $size, and $color as you wish
或者使用多维数组:
$parameters = array(
'prize' => array(),
'size' => array(),
'color' => array(),
);
$segments = $this->uri->segment_array();
$curKey = '';
foreach ($segments as $seg) {
if (in_array($seg, array('prize', 'size', 'color'))) {
$curKey = $seg; continue;
}
if (!empty($curKey)) $parameters[$curKey][] = $seg;
}
我在一个基于搜索的网站上工作,我正在尝试使用 SEO 友好的 URLs 来传递参数。
是否可以通过以下 URL 并在 CodeIgniter 中获取 URL?
http://www.example.com/search/prize/10/13/14.5/size/xl/2xl/color/black/white-grey/
我可以创建 URL,但我想获得 URL 值,例如 $prize = array("10","13","14.5")
、$size= array("xl","2xl")
和 $color = array("black","white-grey")
。
我尝试使用 uri_to_assoc()
功能,但没有用。我得到以下输出:
[price] => 10,
[13] => 14.5
...
这是错误的。
注意:我试过用$this->uri->segment(1)
等,但是在这种情况下,段位置是动态的
例如,用户可能只搜索 的价格,因此 URL 将更改为:
http://www.example.com/search/prize/10/size/xl/2xl/color/black/white-grey/
现在必须更改获取 size
的段位置。在这种情况下,我想要:
$prize = array("10");
$size = array("xl", "2xl");
$color = array("black", "white-grey");
我怎样才能做到这一点?
- 获取所有段
- 遍历它们,检查每个关键字,如
size
、color
等(创建白名单) - 如果找到关键字,假设直到下一个关键字段或结尾的段值是该特定关键字的值(因此
xl
和2xl
将表示大小,如果前面有关键字size
,等等)
您使用的是非常规的 "friendly URI" 格式。通常,在传递参数时,只有一个标识符,然后是参数,例如/name/key/name/key/name/key
.
当您将正确的格式 /name/key/name/key/name/key
与 uri_to_assoc()
结合使用时,您将得到:
array(
'name' => 'key',
// etc...
)
但使用 /prize/1/2/3/size/s/m/l/color/black/white/grey
之类的东西会产生:
array(
'prize' => 1,
2 => 3,
'size' => 's',
'm' => 'l',
// etc...
)
哪个对你没用。
您将必须单独获取所有段并构建您的数组 foreach
:
$segments = $this->uri->segment_array();
$prize = array();
$size = array();
$color = array();
$curKey = '';
foreach ($segments as $seg) {
if (in_array($seg, array('prize', 'size', 'color'))) {
$curKey = $seg; continue;
}
if (!empty($curKey)) ${$curKey}[] = $seg;
}
// use $prize, $size, and $color as you wish
或者使用多维数组:
$parameters = array(
'prize' => array(),
'size' => array(),
'color' => array(),
);
$segments = $this->uri->segment_array();
$curKey = '';
foreach ($segments as $seg) {
if (in_array($seg, array('prize', 'size', 'color'))) {
$curKey = $seg; continue;
}
if (!empty($curKey)) $parameters[$curKey][] = $seg;
}