Dizileri url parametresi olarak geçirme


115

Bir diziyi url parametresi olarak geçirebilmemin en iyi yolu nedir? Bunun mümkün olup olmadığını düşünüyordum:

$aValues = array();

$url = 'http://www.example.com?aParam='.$aValues;

veya buna ne dersin:

$url = 'http://www.example.com?aParam[]='.$aValues;

Örnekler okudum ama karmaşık buluyorum:

$url = 'http://www.example.com?aParam[]=value1&aParam[]=value2&aParam[]=value3';

2
Neden içeri girmiyorsun $_POST?
rastgele

Bu gerçekten dağınık görünüyor. Ancak bu yaklaşım için öyle olmalı. Diğer bir yaklaşım, biraz karmaşık atamaktır query = array('aParam'=> json_encode($arrayOfValues)). Ve daha güzel bir url ile geçebilirsiniz url_encode(implode('/',$query)). URL gibi görünecek www.example.com/aParam/[va1,val2,...]. Alırken json_decode aParam değerini diziye eklemelisiniz.
Vladimir Vukanac

Yanıtlar:


220

Çok basit bir çözüm var: http_build_query(). Sorgu parametrelerinizi ilişkilendirilebilir bir dizi olarak alır:

$data = array(
    1,
    4,
    'a' => 'b',
    'c' => 'd'
);
$query = http_build_query(array('aParam' => $data));

dönecek

string(63) "aParam%5B0%5D=1&aParam%5B1%5D=4&aParam%5Ba%5D=b&aParam%5Bc%5D=d"

http_build_query()sizin için gerekli tüm çıkışları işler ( %5B=> [ve %5D=> ]), bu nedenle bu dize eşittir aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d.


16
Bunu bir diziye nasıl geri getireceğinizi merak ediyorsanız, cevap parse_str () olacaktır .
Yazım

1
Bunu url'yi diziye koymak için kullandım, ancak verileri nasıl geri alacağımı bilmiyorum. Parse_str denedim ve çalışmasını sağlayamadım. Bunun değerli bir bilgi olacağını düşünüyorum
Thomas Williams

2
Herkes ile sorunlar yaşamaya devam http_build_querydönen param[]ve somtimes param[index]. Bu
gönderiye göz atın

2
değeri geri almak için $ data = $ _GET ['aParam'];
dfortun

@dfortun geri dönmek çok zaman kazandığınız önemli parse_str () benim için işe yaramadı ama $ data = $ _GET ['aParam']; doğru çözüm
Asesha George

56

Düzenleme: Stefan'ın çok kullanışlı http_build_query()işlevi kullanan yukarıdaki çözümünü kaçırmayın : https://stackoverflow.com/a/1764199/179125

knittl kaçma konusunda haklı. Ancak, bunu yapmanın daha basit bir yolu var:

$url = 'http://example.com/index.php?';
$url .= 'aValues[]=' . implode('&aValues[]=', array_map('urlencode', $aValues));

Bunu ilişkilendirilebilir bir dizi ile yapmak istiyorsanız, bunun yerine şunu deneyin:

PHP 5.3+ (lambda işlevi)

$url = 'http://example.com/index.php?';
$url .= implode('&', array_map(function($key, $val) {
    return 'aValues[' . urlencode($key) . ']=' . urlencode($val);
  },
  array_keys($aValues), $aValues)
);

PHP <5.3 (geri arama)

function urlify($key, $val) {
  return 'aValues[' . urlencode($key) . ']=' . urlencode($val);
}

$url = 'http://example.com/index.php?';
$url .= implode('&amp;', array_map('urlify', array_keys($aValues), $aValues));

1
düzgün! ilişkisel dizilerle de çalışabilseydi iyi olurdu. Yine de +1
knittl

3
knittl: Bunu, array_map'e bir geriçağırım işlevi ile anahtarları ve değerleri ayrı ayrı ileterek yapabiliriz. Bunu kontrol et.
Jordan

ancak bu yine de GET parametresinin maksimum boyutunu aşabilir değil mi? Aşağıda bahsedilen nash gibi seanslar kullanmamın ihtimali nedir?
uji

Bir oturumda az çok sınırsız miktarda veri depolayabilirsiniz. Oturumlarla ilgili risk, oturum sona erdiğinde veya kullanıcı aynı anda iki sekme gibi şeyler yapmaya çalıştığında URL'lerin kırılmasıdır. Kullanıcı sayfayı yer imlerine eklerse, oturumu sona erdikten sonra geri gelirse, beklediği sayfayı yine de alacak mı? Görünüşe göre mimariniz ve ilk etapta neden bu kadar büyük dizilerin etrafından dolaştığınız hakkında daha fazla düşünmeniz gerekebilir.
Jordan Koşu

+1 iyi cevap ve bu cevabı gönderdikten bir yıl sonra da benim için çalışıyor.
Naveed

10

En kolay yol, serializeişlevi kullanmaktır .

Depolama veya aktarım için herhangi bir değişkeni seri hale getirir. Bunu php kılavuzunda okuyabilirsiniz - serileştirme

Değişken kullanılarak geri yüklenebilir unserialize

Dolayısıyla, kullandığınız URL'ye geçişte:

$url = urlencode(serialize($array))

ve kullandığınız değişkeni geri yüklemek için

$var = unserialize(urldecode($_GET['array']))

Yine de burada dikkatli olun. Bir GET isteğinin maksimum boyutu, dizileri bir URL'de geçirerek kolayca aşabileceğiniz 4k ile sınırlıdır.

Ayrıca, veri aktarmanın gerçekten en güvenli yolu değil! Muhtemelen bunun yerine oturumları kullanmayı düşünmelisiniz.


seri hale getirme de bunu yapmanın güzel bir yolu, ancak artık pek okunaklı olmayan bir biçimde
knittl

1
Evet, url'ler ile çalışırken serileştirme gerçekten de bir şeyler yapmanın temiz bir yolu değildir, çünkü verileri çok fazla genişletir. Özel gitmek daha iyi.
Kzqai

GET parametresinin maksimum boyutu, bu yüzden endişelendiğim şeydi (aptalca), ayrıştırıcının geçirilen bir dizi varsa aldırmayacağını umuyordum. Az önce maksimum boyuta dokunmadan çalışmayacağını anladım. Yine de teşekkürler nash, sanırım bunu seanslarla yapacağım
uji

4
Gerçekten güvenilmeyen verileri unserialize () 'ye iletmemelisiniz. Bunun yerine json_encode () ve json_decode () deneyin.
Mikko Rantalainen

6

( urlencode) çıktısını alırken lütfen değişkenlerinizden çıkın .

ve sadece bir dizi yazdıramazsınız, url'nizi bir şekilde bir döngü kullanarak oluşturmanız gerekir

$url = 'http://example.com/index.php?'
$first = true;
foreach($aValues as $key => $value) {
  if(!$first) $url .= '&amp';
  else $first = false;
  $url .= 'aValues['.urlencode($key).']='.urlencode($value);
}

1
İlk & amp; i atlamak için bir "ilk" değişken kullanmak yerine, değerlerinizi depolamak için geçici bir dizi ve implode afterwords kullanabilirsiniz. Sadece okunabilirlik için. php.net/implode
nash

5
 <?php
$array["a"] = "Thusitha";
$array["b"] = "Sumanadasa";
$array["c"] = "Lakmal";
$array["d"] = "Nanayakkara";

$str = serialize($array);
$strenc = urlencode($str);
print $str . "\n";
print $strenc . "\n";
?> 

print $str . "\n"; verir a:4:{s:1:"a";s:8:"Thusitha";s:1:"b";s:10:"Sumanadasa";s:1:"c";s:6:"Lakmal";s:1:"d";s:11:"Nanayakkara";} ve

print $strenc . "\n"; verir

a%3A4%3A%7Bs%3A1%3A%22a%22%3Bs%3A8%3A%22Thusitha%22%3Bs%3A1%3A%22b%22%3Bs%3A10%3A%22Sumanadasa%22%3Bs%3A1%3A%22c%22%3Bs%3A6%3A%22Lakmal%22%3Bs%3A1%3A%22d%22%3Bs%3A11%3A%22Nanayakkara%22%3B%7D

Dolayısıyla, bunu $arrayURL’den adresine geçirmek istiyorsanız page_no_2.php,

örn: -

$url ='http://page_no_2.php?data=".$strenc."';

Orijinal diziye geri dönmek için, olması gerekenden urldecode()daha sonra, unserialize()page_no_2.php böyle:

    <?php
    $strenc2= $_GET['data'];
    $arr = unserialize(urldecode($strenc2));
    var_dump($arr);
    ?>

verir

 array(4) {
  ["a"]=>
  string(8) "Thusitha"
  ["b"]=>
  string(10) "Sumanadasa"
  ["c"]=>
  string(6) "Lakmal"
  ["d"]=>
  string(11) "Nanayakkara"
}

tekrar: D



1

Bu, daha önce yanıtlandığı için doğrudan bir cevap değil, ama herkes veriyi göndermekten bahsediyordu, ancak kimse oraya ulaştığında ne yaptığını gerçekten söylemedi ve bunu çözmem yarım saatimi aldı. Bu yüzden burada yardımcı olacağımı düşündüm.

Bunu biraz tekrar edeceğim

$data = array(
'cat' => 'moggy',
'dog' => 'mutt'
);
$query = http_build_query(array('mydata' => $data));
$query=urlencode($query);

Açıkçası, bunu www.someurl.com?x=$query'den daha iyi biçimlendirirsiniz

Ve verileri geri almak için

parse_str($_GET['x']);
echo $mydata['dog'];
echo $mydata['cat'];

0
**in create url page**

$data = array(
        'car' => 'Suzuki',
        'Model' => '1976'
        );
$query = http_build_query(array('myArray' => $data));
$url=urlencode($query); 

echo" <p><a href=\"index2.php?data=".$url."\"> Send </a><br /> </p>";

**in received page**

parse_str($_GET['data']);
echo $myArray['car'];
echo '<br/>';
echo $myArray['model'];

0

alınan sayfada şunları kullanabilirsiniz:

parse_str ($ dizge, $ dizi); var_dump ($ dizi);


Stack Overflow'a hoş geldiniz. On yıllık bir soruya sekiz cevapla birlikte bir cevap eklerken, cevabınızın hangi yeni soruyu ele aldığını belirtmek çok önemlidir. Şu anda, diğer yanıtlardan biri tarafından zaten kapsanan yalnızca bir kod yanıtınız var gibi görünüyor. Lütfen gelecekteki yanıtlarda kod için kod biçimlendirmesini kullanın.
Jason Aller

0

Bu, bu sorunu çözmenin başka bir yoludur.

$data = array(
              1,
              4,
             'a' => 'b',
             'c' => 'd'
              );
$query = http_build_query(array('aParam' => $data));
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.