【问题标题】:PHP - Get indexed URL query string parameters from URLPHP - 从 URL 获取索引 URL 查询字符串参数
【发布时间】:2020-06-22 17:35:16
【问题描述】:

我想知道是否有人可以帮助我。我正在从 Segment 向我的后端发送一个 webhook。这是包含参数的目标 URL 的最终结果:

https://example.com/page.php?cid=123456&eventid=965254&trackerid=2523654&amount1=233.55&amount2=156.99&catgory1=clothing&category2=accessories&itemsku1=01235654&itemsku2=525124&quantity1=1&quantity2=3

像 cid 这样的独立参数很容易获得,但是像 category1 和 category2 这样的索引查询字符串参数是我卡住的地方。我尝试了这种方法How to get multiple parameters with same name from a URL in PHP,但这并不是我的情况的正确解决方案。

我还可以选择以 JSON 格式发送 webhook,如果这样更有意义的话,但仍然不确定如何获取索引参数,如 itemsku1 和 itemsku2。

我也忘了说,索引参数会根据购买的产品数量而变化,所以我事先不知道网址中会有多少。

提前致谢!

【问题讨论】:

  • 传递itemsku[]=012&itemsku[]=345itemsku[1]=012&itemsku[2]=345 之类的数组。然后你会有一个$_GET['itemsku'] 数组。你是如何构建这个 URL 的?
  • 这是在您的 url 创建下,请尝试用 cid=123456$eventid=965254 之后的 & 替换 $
  • @ChiragKhatri:不!为什么?

标签: php query-string


【解决方案1】:

试试这样的

<?php

$param_names = [
    'amount',
    'category',
    'itemsku',
    'quantity',
];

$data = [];

foreach ($_GET as $key => $val) {

    foreach ($param_names as $param_name) {

        if (strpos($key, $param_name) === 0) {
            $idx = substr($key, strlen($param_name), 1);

            $data[$idx][$param_name] = $val;
        }
    }

}

var_dump($data);

这是结果

array (size=2)
  1 => 
    array (size=3)
      'amount' => string '233.55' (length=6)
      'category' => string 'clothing' (length=8)
      'itemsku' => string '01235654' (length=8)
      'quantity' => string '1' (length=1)
  2 => 
    array (size=4)
      'amount' => string '156.99' (length=6)
      'category' => string 'accessories' (length=11)
      'itemsku' => string '525124' (length=6)
      'quantity' => string '3' (length=1)

【讨论】:

  • 谢谢@bumperbox。你的方法很有魅力!
  • @nawissor 只是我想到的一件事,它只处理单个数字索引,因为它是 $idx = substr($key, strlen($param_name));如果您从 substr 中删除尾随 1,它将接受任何数字
  • 很好 @bumperbox 并感谢您的提前警告。我会对其进行测试并让您知道,但从我所做的测试来看,它完全符合我的期望。再次感谢。
【解决方案2】:

我不确定我是否理解正确,但你不能使用:

$category1 = filter_input(INPUT_GET,"category1",FILTER_SANITIZE_STRING);
$category2 = filter_input(INPUT_GET,"category2",FILTER_SANITIZE_STRING);
$sku1 = filter_input(INPUT_GET,"itemsku1",FILTER_SANITIZE_STRING);
$sku2 = filter_input(INPUT_GET,"itemsku2",FILTER_SANITIZE_STRING);

等等...除非您不知道索引参数的确切数量,否则您可以使用以下方法,它将参数存储在数组中。

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();
foreach( $query as $param )
{
  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}

假设您将访问链接https://example.com/page.php?itemsku=test1&itemsku=test2

$params['itemsku'][0] 将返回:test1 $params['itemsku'][1] 将返回:test2

要遍历itemsku 参数数组,只需这样做:

foreach($params['itemsku'] as $sku){
   echo $sku . "\n";
}

会输出:

test1
test2

【讨论】:

    【解决方案3】:

    我不确定我是否理解正确,但你可以使用parse_url。在你的情况下:

    $url = 'https://example.com/page.php?cid=123456&eventid=965254&trackerid=2523654&amount1=233.55&amount2=156.99&catgory1=clothing&category2=accessories&itemsku1=01235654&itemsku2=525124&quantity1=1&quantity2=3';
    
    $temp_array = [];
    parse_str(parse_url($url, PHP_URL_QUERY), $temp_array);
    var_dump($temp_array);
    

    这将生成一个包含所有查询参数的数组。然后您可以访问每个参数,例如:

    echo $temp_array['cid'];
    echo $temp_array['catgory1'];
    echo $temp_array['catgory2'];
    echo $temp_array['itemsku1'];
    echo $temp_array['itemsku2'];
    

    【讨论】:

      猜你喜欢
      • 2020-06-12
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      相关资源
      最近更新 更多