Bir ilişkisel diziyi anahtarlarla yerleştirmenin en hızlı yolu


114

İlişkilendirilebilir bir diziyi dizeye çevirmenin hızlı bir yolunu arıyorum. Tipik yapı bir URL sorgu dizesi gibi olabilir, ancak özelleştirilebilir ayırıcılarla, böylece &xhtml bağlantıları için ' &' veya başka türlü ' ' kullanabilirim.

İlk eğilimim kullanmaktır, foreachancak yöntemim bir istekte birçok kez çağrılabileceğinden, çok yavaş olabileceğinden korkuyorum.

<?php
$Amp = $IsXhtml ? '&amp;' : '&';
$Parameters = array('Action' => 'ShowList', 'Page' => '2');
$QueryString = '';
foreach ($Parameters as $Key => $Value)
        $QueryString .= $Amp . $Key . '=' . $Value;

Daha hızlı bir yol var mı?


4
HTML çıktısını alıyorsanız, doğru sözdiziminin & amp; değil &, bu yanlış <a href="?name=joe&age=22"> JOE </a> evet işe yarıyor ama geçersiz HTML.
TravisO

Yanıtlar:


174

Bunu http_build_query()yapmak için kullanabilirsiniz .

Sağlanan ilişkisel (veya dizine alınmış) diziden URL kodlu bir sorgu dizesi oluşturur.


Bu yöntemi PHP API'de kendim bulmaya çalışıyordum, kesinlikle gidilecek yol bu. Aksi takdirde, alternatif uk2.php.net/manual/en/function.implode.php#84684 gibi değiştirilmiş bir implode yöntemi kullanmaksa, ancak http_build_query () düzgün şekilde daha hızlı olacaktır.
Mark Davidson

Merak ediyorum, bu gerçekten genel soru için en hızlı yol mu? Bu işlevde devam eden bazı kodlamalar var. Öyleyse, bir URL için değilse, bu gerçekten array_walk'tan daha hızlı mı ve ya kodlanmasını istemiyorsanız?
e-motivasyon

10
sorun http_build_querykaçış özel karakter
Sisyphus

1
Serialize (), json_encode () ve http_build_query () 'yi karşılaştırdım. http_build_query () serialize () 'ye göre küçük bir farkla kazandı ve json_encode açık ara en yavaş olanı.
ErnestV

5
Ayrıca özel karakterleri de
kodluyor

33

Bir kenara, bir ilişkisel diziyi yerleştirmenin en iyi yolunu bulmak için arayış içindeydim, ancak kendi ayırıcılarımı vb.

Bunu, daha sonra bir HTML etiketine uygulanabilecek bir parametreler listesine ilişkilendirilebilir bir diziyi birleştirmeme izin vermek için PHP'nin array_walk () işlevini kullanarak yaptım ...

// Create Params Array
$p = Array("id"=>"blar","class"=>"myclass","onclick"=>"myJavascriptFunc()");

// Join Params
array_walk($p, create_function('&$i,$k','$i=" $k=\"$i\"";'));
$p_string = implode($p,"");

// Now use $p_string for your html tag

Açıkçası, bunu bir şekilde kendi işlevinize yapıştırabilirsiniz, ancak bu size kendi yönteminizi kullanarak bir ilişkisel diziye nasıl katılabileceğiniz konusunda bir fikir verir. Umarım birine yardımcı olur :)



array_walk foreach'tan daha yavaştır ve okumak için daha karmaşıktır.
Şuna

Http_build_query () URL'leri kodladığından, bu sürümü ilk çözüm olarak yararlı buldu.
Ernesto Allely

32

Tam biçimlendirmeyle ilgilenmiyorsanız, ancak basit bir şey istiyorsanız, ancak satır sonları olmadan print_rda json_encode($value)hızlı ve basit biçimlendirilmiş bir çıktı için kullanabilirsiniz. ( diğer veri türlerinde de iyi çalıştığını unutmayın )

$str = json_encode($arr);
//output...
[{"id":"123","name":"Ice"},{"id":"234","name":"Cake"},{"id":"345","name":"Pie"}]

19

Bu, örneğin bir div veri öznitelikleri için benim çözümüm:

<?

$attributes = array(
    'data-href'   => 'http://example.com',
    'data-width'  => '300',
    'data-height' => '250',
    'data-type'   => 'cover',
);

$dataAttributes = array_map(function($value, $key) {
    return $key.'="'.$value.'"';
}, array_values($attributes), array_keys($attributes));

$dataAttributes = implode(' ', $dataAttributes);

?>

<div class="image-box" <?= $dataAttributes; ?> >
    <img src="http://example.com/images/best-of.jpg" alt="">
</div>

18

Bir yol kullanmaktır print_r(array, true)ve dizinin dize gösterimini döndürür


1
$ request_str = print_r ($ _ İSTEK, true); // günlük dosyası için diziyi düzleştir
zzapper

2
Ancak bu, key=valuesağlanan ayırıcıyla birleştirildiği gibi değil, print_r biçiminde çıktılar .
Rikki

1
function array_to_attributes ( $array_attributes )
{

    $attributes_str = NULL;
    foreach ( $array_attributes as $attribute => $value )
    {

        $attributes_str .= " $attribute=\"$value\" ";

    }

    return $attributes_str;
}

$attributes = array(
    'data-href'   => 'http://example.com',
    'data-width'  => '300',
    'data-height' => '250',
    'data-type'   => 'cover',
);

echo array_to_attributes($attributes) ;

1

Basit bir diziden HTML öznitelikleri dizisi (tırnak işaretleriyle) oluşturmak için tek satırlık bir:

$attrString = str_replace("+", " ", str_replace("&", "\" ", str_replace("=", "=\"", http_build_query($attrArray)))) . "\"";

Misal:

$attrArray = array("id"    => "email", 
                   "name"  => "email",
                   "type"  => "email",
                   "class" => "active large");

echo str_replace("+", " ", str_replace("&", "\" ", str_replace("=", "=\"", http_build_query($attrArray)))) . "\"";

// Output:
// id="email" name="email" type="email" class="active large"

1

Çözümüm:

$url_string = http_build_query($your_arr);
$res = urldecode($url_string); 

0

Peki array_walk ile bu daha kısa, daha şeffaf ve daha sezgisel

$attributes = array(
  'data-href'   => 'http://example.com',
  'data-width'  => '300',
  'data-height' => '250',
  'data-type'   => 'cover',
);

$args = "";
array_walk(
    $attributes, 
    function ($item, $key) use (&$args) {
        $args .= $key ." = '" . $item . "' ";  
    }
);
// output: 'data-href="http://example.com" data-width="300" data-height="250" data-type="cover"

-2

Bu aklıma gelen en temel versiyon:

public function implode_key($glue = "", $pieces = array())
{
    $keys = array_keys($pieces);
    return implode($glue, $keys);
}

12
Bu sadece anahtarları patlatır, key=valueseçilen bir ayırıcıyla birlikte patlamaz !
Rikki

-3
echo implode(",", array_keys($companies->toArray()));

$companies->toArray()- bu, sizin $variablebir nesneniz olması durumunda geçerlidir , aksi takdirde sadece $ şirketleri geçirin .

Bu kadar!


Bu yalnızca anahtarları dizeye ekler; değerler kaybolur.
FluffyKitten
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.