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


114

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

私の最初の傾向は使用することですforeachが、私のメソッドは1つの要求で何度も呼び出される可能性があるため、遅すぎる可能性があります。

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

より速い方法はありますか?


4
HTMLを出力する場合は忘れないでください。正しい構文は&amp;です。&ではなく、これは間違っています<a href="?name=joe&age=22"> JOE </a>はい、動作しますが、HTMLが無効です。
TravisO 2009年

回答:


174

あなたhttp_build_query()はそれを行うために使用することができます。

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


私自身、PHP APIでこのメソッドを見つけようとしていましたが、これで間違いありません。そうでない場合、代替手段はuk2.php.net/manual/en/function.implode.php#84684などの変更された分解メソッドを使用することですが、http_build_query()は適切に高速になります。
Mark Davidson、

これが一般的な質問にとって本当に最速の方法かどうか疑問に思います。この関数ではいくつかのエンコーディングが行われています。それで、それがURLでない場合、これは本当にarray_walkよりも高速ですか、それをエンコードしたくない場合はどうなりますか?
e-motiv 2014年

10
問題はhttp_build_queryエスケープスペシャルチャーです
Sisyphus

1
serialize()、json_encode()、http_build_query()を比較しました。http_build_query()は、serialize()よりもわずかに優れており、json_encodeがはるかに低速です。
ErnestV 2015

5
特殊文字もエンコードするため、これは適切なオプションではありません
awavi

33

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

そこで、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

明らかに、あなたはそれをあなた自身の関数にどういうわけか固執することができますが、あなたはあなたがあなた自身の方法を使用して連想配列に参加することができる方法のアイデアを与えます。それが誰かを助けることを願っています:)


6
create_functionの構文で混乱を招く場合は、php.net / manual
Matt Fletcher

array_walkはforeachより遅く、読み取りがより複雑です。:この参照reddit.com/r/PHP/comments/1u​​uc34/...
Enyby

http_build_query()がURLをエンコードするため、このバージョンは最初のソリューションとして有用であることがわかりました。
Ernesto Allely

32

正確な書式設定に関心がない場合は、簡単なものをprint_r使用json_encode($value)しますが、改行せずにすばやく簡単な書式設定された出力に使用することもできます。(他のデータ型でもうまく機能することに注意してください

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

19

これは、たとえば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>

18

1つの方法は使用してprint_r(array, true)おり、配列の文字列表現を返します


1
$ request_str = print_r($ _ REQUEST、true); //ログファイルの配列をフラット化します
zzapper 2013年

2
ただし、出力は、key=value提供されたセパレーターと結合された形式ではなく、print_r形式で出力されます。
リッキ

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

単純な配列から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"


0

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"

-2

これは私が考えることができる最も基本的なバージョンです:

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

12
これはキーを内破するだけkey=valueで、選択したセパレータで内破されません!
リッキ

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

$companies->toArray()-これは$variable、オブジェクトがオブジェクトである場合に備えて、そうでなければ$ companiesを渡します。

それでおしまい!


これはキーを文字列に追加するだけです。値は失われます。
FluffyKitten
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.