Bir dizeyi sorgu dizesi içine nasıl geçirebilirim?


355

Bir dizeyi sorgu dizesinden geçirmenin standart bir yolu var mı?

Açık olmak gerekirse, biri bir dizi değeri olurdu birden çok değer içeren bir sorgu dizesi var. Ben sorgu dizesi değeri bir dizi olarak ele alınmasını istiyorum-dizi diğer sorgu dizesi değişkenlerinden ayırt edilemez böylece patladı istemiyorum.

Ayrıca, bu gönderi yanıtına göre, yazar, diziler için sorgu dizesi desteğinin tanımlanmadığını önerir. Bu doğru mu?

DÜZENLE:

@ Alex'in cevabına dayanarak, bunu yapmanın standart bir yolu yoktur, bu yüzden benim izlemim, okuduğum parametrenin PHP ve Javascript'te bir dizi olduğunu tanımanın kolay bir yolu nedir?

Aynı adı birden fazla param isimlendirmek kabul edilebilir ve bu şekilde bir diziye ait olduğunu bilecekti? Misal:

?myarray=value1&myarray=value2&myarray=value3...

Yoksa bu kötü bir uygulama mıdır?


Hangi çerçeveyi kullanıyorsunuz? Bazı çerçevelerde dizileri sorgu dizelerine geçirmeye yardımcı olacak yöntemler bulunur.
keyboardP

@ keyboardP- PHP ve Javascript, kullanım durumuna göre
Yarin

2
Neden bunu yapabildiğiniz zaman yapmak istersiniz
:? Myarray

18
@seroids: virgül, soru işareti, eşit işaret ve yazdırılamayan karakterleri geçmesi gerekiyorsa ne olacak?
Berry Tsakala

Yanıtlar:


432

İşte anladım:

Çok değerli form alanlarının gönderilmesi, diğer bir deyişle GET / POST değişkenleri yoluyla dizilerin gönderilmesi, bir standart zorunlu olarak belirtilmediğinden, birkaç farklı yolla yapılabilir.

Çok değerli alanlar veya diziler göndermenin üç olası yolu:

  • ?cars[]=Saab&cars[]=Audi (En iyi yol - PHP bunu bir diziye okur)
  • ?cars=Saab&cars=Audi (Kötü yol - PHP yalnızca son değeri kaydeder)
  • ?cars=Saab,Audi (Bunu denemedim)

Form Örnekleri

Bir formda, çok değerli alanlar, birden çok değere ayarlanmış bir seçim kutusu biçimini alabilir :

<form> 
    <select multiple="multiple" name="cars[]"> 
        <option>Volvo</option> 
        <option>Saab</option> 
        <option>Mercedes</option> 
    </select>
</form>

(NOT: Bu durumda, some_name[]sonuç denetiminin PHP tarafından bir dizi olarak kaydedilmesi için select denetiminin adlandırılması önemlidir )

... veya aynı ada sahip birden çok gizli alan olarak :

<input type="hidden" name="cars[]" value="Volvo">
<input type="hidden" name="cars[]" value="Saab">
<input type="hidden" name="cars[]" value="Mercedes">

NOT:field[] Birden çok değer için kullanmak gerçekten kötü belgelenmiştir. Sorgu dizesi - Wikipedia'daki çok değerli tuşlar bölümünde veya çoklu seçim girişleriyle ilgilenen W3C belgelerinde bundan bahsetmiyorum .


GÜNCELLEME

Yorum yapanların belirttiği gibi, bu çok fazla çerçeveye özgüdür. Bazı örnekler:

Sorgu dizesi:

?list_a=1&list_a=2&list_a=3&list_b[]=1&list_b[]=2&list_b[]=3&list_c=1,2,3

Raylar:

"list_a": "3", 
"list_b":[
    "1",
    "2",
    "3"
  ], 
"list_c": "1,2,3"

Açısal:

 "list_a": [
    "1",
    "2",
    "3"
  ],
  "list_b[]": [
    "1",
    "2",
    "3"
  ],
  "list_c": "1,2,3"

(Açısal tartışma )

Örneklere ilişkin açıklamalara bakınız node.js , Wordpress , ASP.net


Siparişi korumak: Dikkate alınması gereken bir şey daha , öğelerinizin sırasını (yani sıralı bir liste olarak dizi) sürdürmeniz gerekiyorsa , gerçekten sınırlandırılmış bir değer listesini geçiren ve açıkça kendiniz bir dizi.


3
Bu işlevin Wiki veya W3C gibi genel kaynaklarda belgelenmemesinin nedeninin genellikle web çerçeveleri tarafından desteklenmemesidir. PHP ve ben Rails otomatik olarak birden çok "anahtar []" sorgu parametrelerini bir diziye dönüştürmek düşünüyorum. Diğerleri değil.
Carl G

3
Nodejs querystring modülü şu ?cars=Saab&cars=Audişekildedir
SystemParadox

53
Ekspres (node.js), her iki ?cars=Saab&cars=Audive ?cars[]=Saab&cars[]=Audidiziler dönüştü. Ancak, ?cars=Saabdize olarak sonlanır, ancak ?cars[]=Saabtek bir öğeye sahip bir dizidir.
Trevor Dixon

5
Bu yaklaşımı kullanarak anahtarlar ayarlayabilir misiniz? Peki ya çok boyutlu diziler?
Qwerty

5
ASP.NET MVC biçimini okumak için görünmüyor ?cars[]=Saab&cars[]=AudiKare köşeli ayraç yok veya köşeli ayraçlar dizinleri gerekir /
Bay Flibble

37

Bir sorgu dizesi, metin verilerini taşır, böylece diziyi patlatmak, doğru şekilde kodlamak ve seçtiğiniz temsili bir biçimde iletmekten başka seçenek yoktur:

p1=value1&pN=valueN...
data=[value1,...,valueN]
data={p1:value1,...,pN:valueN}

ve ardından sunucu tarafı kodunuzda kodunu çözün.


Tamam açıklama için teşekkürler. Gözden geçirilmiş sorumu görebiliyor musunuz - p1 ... pn, tuşlar için gerekli mi, yoksa sadece birden fazla tuşa 'p' adını verebilir miyim ve bu şekilde hepsinin aynı diziye ait olduğunu bilir miyim?
Yarin

1
Aynı adı kullanabilirsiniz; stackoverflow.com/questions/2203430/… ya da sadece p = aa, bb, cc, Serodis'in açıkladığı gibi en belirgin yol.
Alex K.

JSON.stringifyve ile çok kullanışlı JSON.parse!
charliebrownie

1
Basit ve ortak bir temsili biçim PHP json_encodeo zaman rawurlencodeve json_decodediğer sayfada kullanarak JSON .
Edward

20

Bir standart olduğunu sanmıyorum.
Her web ortamı bu tür şeyler için kendi 'standardını' sağlar. Ayrıca, url genellikle herhangi bir şey için çok kısadır (bazı tarayıcılarda 256 bayt sınırı). Elbette POST istekleri ile daha uzun diziler / veriler gönderilebilir.

Ancak, bazı yöntemler vardır:

  1. URL sorgularında köşeli parantez ( [, ]) kullanan bir PHP yolu vardır . Örneğin, böyle bir sorgunun ?array_name[]=item&array_name[]=item_2PHP belgelerinin otomatik olarak bir diziye dönüştürülmesiyle birlikte, belgelenmemiş olmasına rağmen işe yaradığı söylenmiştir. Kaynak: https://stackoverflow.com/a/9547490/3787376

  2. Nesnelerin veri alışverişi biçimleri (örn. JSON - resmi web sitesi , PHP belgeleri ), JSON gibi değişkenleri dizelere ve dizelerden dönüştürme yöntemlerine sahiplerse de kullanılabilir.
    Ayrıca HTTP alma isteklerinin dize verilerini doğru şekilde kodlaması için bir url kodlayıcı (çoğu programlama dili için kullanılabilir) gereklidir.

"Köşeli ayraç yöntemi" basit ve çalışıyor olsa da, PHP ve dizilerle sınırlıdır.
PHP gibi bir dilde sınıflar veya sorgu dizeleri içinde değişkenler geçirme gibi başka değişken türleri gerekiyorsa, JSON yöntemi önerilir.

PHP JSON yöntemi örneği (yöntem 2):

$myarray = array(2, 46, 34, "dfg");
$serialized = json_encode($myarray)
$data = 'myarray=' . rawurlencode($serialized);
// Send to page via cURL, header() or other service.

Alma sayfası kodu (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.

1
Express.js ayrıca 4.13.4'te test edilen köşeli parantez gösterimini de destekler.
Steve Kehlet

7

Ben bir sunucu uygulamasına bir sorgu dizesinde dizi geçen arayan biri için yararlı olacağını hissediyorum. Ben sorgu dizesi aşağıda test ve req.getgetParameterValues ​​() kullanarak dizi değerleri elde edebildi; yöntem. Aşağıda tarayıcıdan geçirdiğim sorgu dizesi var.

  http://localhost:8080/ServletsTutorials/*.html? 
  myname=abc&initial=xyz&checkbox=a&checkbox=b

onay kutusu benim parametre dizim.


5

Bu benim için çalışıyor:

Bağlantıda, özniteliğin değeri var:

to="/filter/arr?fruits=apple&fruits=banana"

Rota bunun üstesinden gelebilir:

path="/filter/:arr"

Birden çok dizi için:

to="filter/arr?fruits=apple&fruits=banana&vegetables=potato&vegetables=onion"

Güzergah aynı kalır.

EKRAN GÖRÜNTÜSÜ

resim açıklamasını buraya girin


2

Sorunuzda PHP ve Javascript'ten bahsediyorsunuz, ancak etiketlerde değil. Bir MVC.Net eylemine bir dizi geçmek niyetiyle bu soruya ulaştım.

Sorumun cevabını burada buldum : beklenen format, sorunuzda önerdiğiniz formattır ve aynı ada sahip birden fazla parametre vardır.


2
Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
Andrew

@Andrew Bu sadece bir link yanıtı değildir. "Beklenen biçim, aynı ada sahip birden fazla parametreyle sorunuzda önerdiğiniz biçimdir."
DCShannon

2

React and Rails kullanıyorum. Yaptım:

js

  let params = {
    filter_array: ['A', 'B', 'C']
  }

  ...

  //transform params in URI

  Object.keys(params).map(key => {
    if (Array.isArray(params[key])) {
      return params[key].map((value) => `${key}[]=${value}`).join('&')
    }
  }
  //filter_array[]=A&filter_array[]=B&filter_array[]=C

1

PHP'deki bir diziden URL kodlamalı sorgu dizesi oluşturmak için http_build_query kullanabilirsiniz . Ortaya çıkan sorgu dizisi genişletilirken, http_build_queryyönteme parametre olarak istediğiniz benzersiz bir ayırıcıya karar verebilirsiniz , böylece kod çözme söz konusu olduğunda, hangi ayırıcının kullanıldığını kontrol edebilirsiniz. Seçtiğiniz benzersiz olsaydı, dizi sorgu dizesi olurdu, aksi takdirde normal sorgu dizeleri olurdu.


1

URL bölümünde bir standart olmasa da, JavaScript için bir standart vardır. Dizileri içeren nesneleri iletir URLSearchParamsve çağırırsanız toString(), virgülle ayrılmış bir öğe listesine dönüştürür:

let data = {
  str: 'abc',
  arr: ['abc', 123]
}

new URLSearchParams(data).toString();  # ?str=abc&arr=abc,123

0

Http://php.net/manual/en/function.parse-str.phpparse_string işlevini kontrol edin

Diziler dahil bir sorgu dizesindeki tüm değişkenleri döndürür.

Php.net'ten bir örnek:

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.