Hướng dẫn how can i get multiple parameters with same name from url in php? - làm cách nào tôi có thể nhận nhiều tham số có cùng tên từ url trong php?

Tôi có một ứng dụng PHP thỉnh thoảng phải xử lý các URL trong đó có nhiều tham số trong URL sẽ có cùng tên. Có một cách dễ dàng để truy xuất tất cả các giá trị cho một khóa nhất định? PHP $ _GET chỉ trả về giá trị cuối cùng.

Để tạo ra bê tông này, ứng dụng của tôi là một trình phân giải OpenUrl và có thể nhận được các tham số URL như thế này:

ctx_ver=Z39.88-2004
&rft_id=info:oclcnum/1903126
&rft_id=http://www.biodiversitylibrary.org/bibliography/4323
&rft_val_fmt=info:ofi/fmt:kev:mtx:book
&rft.genre=book
&rft.btitle=At last: a Christmas in the West Indies. 
&rft.place=London,
&rft.pub=Macmillan and co.,
&rft.aufirst=Charles
&rft.aulast=Kingsley
&rft.au=Kingsley, Charles,
&rft.pages=1-352
&rft.tpages=352
&rft.date=1871

(Vâng, tôi biết nó xấu xí, chào mừng bạn đến với thế giới của tôi). Lưu ý rằng khóa "RFT_ID" xuất hiện hai lần:

  1. $query  = explode('&', $_SERVER['QUERY_STRING']);
    $params = array();
    
    foreach( $query as $param )
    {
      // prevent notice on explode() if $param has no '='
      if (strpos($param, '=') === false) $param += '=';
    
      list($name, $value) = explode('=', $param, 2);
      $params[urldecode($name)][] = urldecode($value);
    }
    
    2
  2. $query  = explode('&', $_SERVER['QUERY_STRING']);
    $params = array();
    
    foreach( $query as $param )
    {
      // prevent notice on explode() if $param has no '='
      if (strpos($param, '=') === false) $param += '=';
    
      list($name, $value) = explode('=', $param, 2);
      $params[urldecode($name)][] = urldecode($value);
    }
    
    3

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}
4 sẽ trả về chỉ
$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}
5, giá trị trước đó (
$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}
6) đã bị ghi đè.

Tôi muốn có quyền truy cập vào cả hai giá trị. Điều này có thể trong PHP không? Nếu không, bất kỳ suy nghĩ về cách xử lý vấn đề này?

Hướng dẫn how can i get multiple parameters with same name from url in php? - làm cách nào tôi có thể nhận nhiều tham số có cùng tên từ url trong php?

Tomalak

326K66 Huy hiệu vàng516 Huy hiệu bạc619 Huy hiệu Đồng66 gold badges516 silver badges619 bronze badges

Đã hỏi ngày 9 tháng 12 năm 2008 lúc 16:33Dec 9, 2008 at 16:33

1

Cái gì đó như:

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}

mang đến cho bạn:

array(
  'ctx_ver'     => array('Z39.88-2004'),
  'rft_id'      => array('info:oclcnum/1903126', 'http://www.biodiversitylibrary.org/bibliography/4323'),
  'rft_val_fmt' => array('info:ofi/fmt:kev:mtx:book'),
  'rft.genre'   => array('book'),
  'rft.btitle'  => array('At last: a Christmas in the West Indies.'),
  'rft.place'   => array('London'),
  'rft.pub'     => array('Macmillan and co.'),
  'rft.aufirst' => array('Charles'),
  'rft.aulast'  => array('Kingsley'),
  'rft.au'      => array('Kingsley, Charles'),
  'rft.pages'   => array('1-352'),
  'rft.tpages'  => array('352'),
  'rft.date'    => array('1871')
)

Vì luôn có thể lặp lại một tham số URL, nên tốt hơn là luôn luôn có các mảng, thay vì chỉ cho các tham số mà bạn dự đoán chúng.

Đã trả lời ngày 9 tháng 12 năm 2008 lúc 16:46Dec 9, 2008 at 16:46

TomalaktomalakTomalak

326K66 Huy hiệu vàng516 Huy hiệu bạc619 Huy hiệu Đồng66 gold badges516 silver badges619 bronze badges

9

Đã hỏi ngày 9 tháng 12 năm 2008 lúc 16:33

IE:

someurl.php?name[]=aaa&name[]=bbb

Cái gì đó như:

array(0=>'aaa', 1=>'bbb')

mang đến cho bạn:Dec 9, 2008 at 16:41

Vì luôn có thể lặp lại một tham số URL, nên tốt hơn là luôn luôn có các mảng, thay vì chỉ cho các tham số mà bạn dự đoán chúng.benlumley

Đã trả lời ngày 9 tháng 12 năm 2008 lúc 16:462 gold badges38 silver badges39 bronze badges

2

Tomalaktomalak

Sẽ không hoạt động cho bạn vì có vẻ như bạn không kiểm soát trình tự truy vấn, nhưng một câu trả lời hợp lệ khác: thay vì phân tích cú pháp trình điều khiển, bạn có thể áp dụng '[]' mặt hàng.

$query = $_SERVER['QUERY_STRING'];
$vars = array();
foreach (explode('&', $query) as $pair) {
    list($key, $value) = explode('=', $pair);
    $vars[] = array(urldecode($key), urldecode($value));
}

Sẽ cung cấp cho bạn một $ _get trông giống như:

array(
    array('ctx_ver'     => 'Z39.88-2004'),
    array('rft_id'      => 'info:oclcnum/1903126'),
    array('rft_id'      => 'http://www.biodiversitylibrary.org/bibliography/4323'),
    array('rft_val_fmt' => 'info:ofi/fmt:kev:mtx:book'),
    array('rft.genre'   => 'book'),
    array('rft.btitle'  => 'At last: a Christmas in the West Indies.'),
    array('rft.place'   => 'London'),
    array('rft.pub'     => 'Macmillan and co.'),
    array('rft.aufirst' => 'Charles'),
    array('rft.aulast'  => 'Kingsley'),
    array('rft.au'      => 'Kingsley, Charles'),
    array('rft.pages'   => '1-352'),
    array('rft.tpages'  => '352'),
    array('rft.date'    => '1871')
)

Đã trả lời ngày 9 tháng 12 năm 2008 lúc 16:41

BenlumleybenlumleyDec 9, 2008 at 16:37

11.3k2 Huy hiệu vàng38 Huy hiệu bạc39 Huy hiệu đồngStefan Gehrig

Tôi nghĩ rằng bạn phải phân tích thủ công

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}
7.24 gold badges155 silver badges186 bronze badges

1

Một cái gì đó như (chưa được kiểm tra):

// Replace `&x=1&x=2` into `x[]=1&x[]=2`
$qs = preg_replace("/(?<=^|&)(\w+)(?==)/", "$1[]", $_SERVER["QUERY_STRING"]);

Điều này sẽ cung cấp cho bạn một mảng

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}
8:

parse_str($qs, $new_GET);

Sau khi xem câu trả lời của Tomalak, tôi thích định dạng dữ liệu của anh ấy cho mảng kết quả tốt hơn nhiều, vì nó có thể truy cập các khóa cụ thể bằng tên của họ.

Đã trả lời ngày 9 tháng 12 năm 2008 lúc 16:37

Stefan Gehrigstefan Gehrig

81.7K24 Huy hiệu vàng155 Huy hiệu bạc186 Huy hiệu đồng37 gold badges108 silver badges127 bronze badges

Không cần phải sử dụng cách giải quyết

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}
9 cho việc này. Một regex đơn giản có thể dễ dàng khắc phục một query_string với nhiều tham số có tên như:Sep 21, 2015 at 17:34

Sau đó, nó đơn giản như sử dụng

array(
  'ctx_ver'     => array('Z39.88-2004'),
  'rft_id'      => array('info:oclcnum/1903126', 'http://www.biodiversitylibrary.org/bibliography/4323'),
  'rft_val_fmt' => array('info:ofi/fmt:kev:mtx:book'),
  'rft.genre'   => array('book'),
  'rft.btitle'  => array('At last: a Christmas in the West Indies.'),
  'rft.place'   => array('London'),
  'rft.pub'     => array('Macmillan and co.'),
  'rft.aufirst' => array('Charles'),
  'rft.aulast'  => array('Kingsley'),
  'rft.au'      => array('Kingsley, Charles'),
  'rft.pages'   => array('1-352'),
  'rft.tpages'  => array('352'),
  'rft.date'    => array('1871')
)
0:mario

Trong đó có lợi thế của việc giải mã chính xác

array(
  'ctx_ver'     => array('Z39.88-2004'),
  'rft_id'      => array('info:oclcnum/1903126', 'http://www.biodiversitylibrary.org/bibliography/4323'),
  'rft_val_fmt' => array('info:ofi/fmt:kev:mtx:book'),
  'rft.genre'   => array('book'),
  'rft.btitle'  => array('At last: a Christmas in the West Indies.'),
  'rft.place'   => array('London'),
  'rft.pub'     => array('Macmillan and co.'),
  'rft.aufirst' => array('Charles'),
  'rft.aulast'  => array('Kingsley'),
  'rft.au'      => array('Kingsley, Charles'),
  'rft.pages'   => array('1-352'),
  'rft.tpages'  => array('352'),
  'rft.date'    => array('1871')
)
1 URL thoát ra ngay lập tức.20 gold badges236 silver badges286 bronze badges

Nếu bạn chỉ muốn một hoặc một vài tham số cụ thể được trích xuất dưới dạng mảng, thì hãy sử dụng

array(
  'ctx_ver'     => array('Z39.88-2004'),
  'rft_id'      => array('info:oclcnum/1903126', 'http://www.biodiversitylibrary.org/bibliography/4323'),
  'rft_val_fmt' => array('info:ofi/fmt:kev:mtx:book'),
  'rft.genre'   => array('book'),
  'rft.btitle'  => array('At last: a Christmas in the West Indies.'),
  'rft.place'   => array('London'),
  'rft.pub'     => array('Macmillan and co.'),
  'rft.aufirst' => array('Charles'),
  'rft.aulast'  => array('Kingsley'),
  'rft.au'      => array('Kingsley, Charles'),
  'rft.pages'   => array('1-352'),
  'rft.tpages'  => array('352'),
  'rft.date'    => array('1871')
)
2 thay vì
array(
  'ctx_ver'     => array('Z39.88-2004'),
  'rft_id'      => array('info:oclcnum/1903126', 'http://www.biodiversitylibrary.org/bibliography/4323'),
  'rft_val_fmt' => array('info:ofi/fmt:kev:mtx:book'),
  'rft.genre'   => array('book'),
  'rft.btitle'  => array('At last: a Christmas in the West Indies.'),
  'rft.place'   => array('London'),
  'rft.pub'     => array('Macmillan and co.'),
  'rft.aufirst' => array('Charles'),
  'rft.aulast'  => array('Kingsley'),
  'rft.au'      => array('Kingsley, Charles'),
  'rft.pages'   => array('1-352'),
  'rft.tpages'  => array('352'),
  'rft.date'    => array('1871')
)
3 trong Regex.

param1=2549&appname=appName1&appname=appName2&appname=appName3&appname=appName4&appname=appName5&apptype=thetype&idsess=1231324567980147dzeze55sd4&action=myaction

Hoàn tác ♦

public static function getMultipleParameters()
    {
        $query = $_SERVER['QUERY_STRING'];
        $vars = array();
        $second = array();
        foreach (explode('&', $query) as $pair) {
            list($key, $value) = explode('=', $pair);
            if('' == trim($value)){
                continue;
            }

            if (array_key_exists($key, $vars)) {
                if (!array_key_exists($key, $second))
                    $second[$key][] .= $vars[$key];
                $second[$key][] = $value;
            } else {
                $vars[$key] = urldecode($value);
            }
        }
        return array_merge($vars, $second);
    }

25.3K37 Huy hiệu vàng108 Huy hiệu bạc127 Huy hiệu đồng

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}
0

Đã trả lời ngày 21 tháng 9 năm 2015 lúc 17:34

Hướng dẫn how can i get multiple parameters with same name from url in php? - làm cách nào tôi có thể nhận nhiều tham số có cùng tên từ url trong php?

ariomarioJul 4, 2012 at 16:18

Phù vàng 143K20 Huy hiệu vàng236 Huy hiệu đồng

Giả sử bạn có một chuỗi truy vấn như thế này:

Hướng dẫn how can i get multiple parameters with same name from url in php? - làm cách nào tôi có thể nhận nhiều tham số có cùng tên từ url trong php?

Bạn có thể làm được việc này :

Điều đó cho:12 gold badges103 silver badges166 bronze badges

Hy vọng điều đó sẽ giúp;)Dec 9, 2008 at 16:38

Đã trả lời ngày 4 tháng 7 năm 2012 lúc 16:18Neil Aitken

Afaik không có cách nào để có được các giá trị trùng lặp bằng cách sử dụng

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}
4 vì giá trị thứ hai sẽ ghi đè lên3 gold badges41 silver badges40 bronze badges

Để vượt qua nó, bạn có thể truy cập vào truy vấn thô bằng cách sử dụng

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}
7 và sau đó tự phân tích nó.

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}
1

Jin KwonMay 9, 2013 at 14:21

18.9K12 Huy hiệu vàng103 Huy hiệu bạc166 Huy hiệu ĐồngTimo Huovinen

Đã trả lời ngày 9 tháng 12 năm 2008 lúc 16:3833 gold badges147 silver badges138 bronze badges

Làm thế nào URL có thể có nhiều tham số truy vấn?

Các tham số URL được tạo bằng một khóa và một giá trị, được phân tách bằng một dấu bằng (=). Nhiều tham số sau đó được phân tách bằng một ampersand và).Multiple parameters are each then separated by an ampersand (&).

Làm thế nào tôi có thể nhận được nhiều giá trị từ URL yêu cầu?

Bất kỳ từ nào sau dấu hỏi (?) Trong URL được coi là một tham số có thể giữ các giá trị.Giá trị cho tham số tương ứng được đưa ra sau ký hiệu "bằng" (=).Nhiều tham số có thể được truyền qua URL bằng cách tách chúng bằng nhiều "&".separating them with multiple "&".

Có bao nhiêu tham số truy vấn chúng ta có thể vượt qua với URL?

Không có giới hạn trong lý thuyết.Đối với URL HTTP, trạng thái đặc tả HTTP 1.1: Giao thức HTTP không đặt bất kỳ giới hạn tiên nghiệm nào về độ dài của URI.no limit in theory. For HTTP URLs, the HTTP 1.1 specification states: The HTTP protocol does not place any a priori limit on the length of a URI.

Làm thế nào tôi có thể nối một tham số truy vấn vào một URL hiện có?

Các tham số truy vấn là một tập hợp các tham số được xác định được gắn vào cuối URL.Chúng là các phần mở rộng của URL được sử dụng để giúp xác định nội dung hoặc hành động cụ thể dựa trên dữ liệu được truyền.Để nối các thông số truy vấn vào cuối URL, một '?'Được thêm vào theo sau ngay lập tức bởi một tham số truy vấn.a '? ' Is added followed immediately by a query parameter.