web-dev-qa-db-ja.com

キーで連想配列を分解する最も速い方法

連想配列を文字列に変換する高速な方法を探しています。典型的な構造はURLクエリ文字列に似ていますが、カスタマイズ可能なセパレータがあるため、xhtmlリンクには「&」を使用でき、そうでない場合は「&」を使用できます。

私の最初の傾向はforeachを使用することですが、私のメソッドは1つのリクエストで何度も呼び出される可能性があるため、遅すぎるのではないかと心配しています。

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

もっと速い方法はありますか?

109
matpie

http_build_query() を使用してそれを行うことができます。

指定された連想配列(またはインデックス付き配列)からURLエンコードされたクエリ文字列を生成します。

164
Greg

余談ですが、連想配列を内破する最良の方法を見つけるために探していましたが、独自のセパレータなどを使用していました...

そのため、PHPのarray_walk()関数を使用してこれを行い、連想配列をパラメーターのリストに結合して、HTMLタグに適用できるようにしました。

// 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

明らかに、それを何らかの方法で独自の関数に固定することもできますが、独自のメソッドを使用して連想配列に結合する方法のアイデアを提供します。それが誰かを助けることを願っています:)

32
Adam

exact formatingに関心がない場合でも、シンプルなものが必要ですが、print_rの改行なしで、json_encode($value)を使用して、すばやく簡単なフォーマット済み出力を行うこともできます。 。 (他のデータ型でもうまく機能することに注意してください

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

これは、たとえばdivデータ属性に対する私のソリューションです:

<?

$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>
19
user4846194

1つの方法はprint_r(array, true)を使用することで、配列の文字列表現を返します

17
dino.keco

単純な配列からHTML属性の文字列(引用符付き)を作成するためのワンライナー:

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

例:

$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
WackGet

私の解決策:

$url_string = http_build_query($your_arr);
$res = urldecode($url_string); 
0
kostikovmu
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) ;
0
Softmixt

Array_walkを使用すると、このより短く、透明性が高くなり、さらに直感的になります

$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"
0
FantomX1