用键分解关联数组的最快方法


114

我正在寻找一种将关联数组转换为字符串的快速方法。典型的结构类似于URL查询字符串,但具有可自定义的分隔符,因此我可以将' &'用于xhtml链接,&否则可以使用' ' 。

我的第一个倾向是使用,foreach但是由于我的方法可以在一个请求中多次调用,所以我担心它可能太慢。

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

Answers:


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 2015年

1
我比较了serialize(),json_encode()和http_build_query()。http_build_query()比serialize()赢了一点点,而json_encode是迄今为止最慢的。
ErnestV 2015年

5
它还编码特殊字符,因此这不是一个好选择
awavi 2015年

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/en/function.create-function.php
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

一种使用方法print_r(array, true),它将返回数组的字符串表示形式


1
$ request_str = print_r($ _ REQUEST,true); //
整理

2
但是,该输出以print_r格式输出,而不是key=value与提供的分隔符连接的输出。
Rikki 2014年

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所选的分隔符!
Rikki 2014年

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

$companies->toArray()-如果您$variable是对象,以防万一,否则只需传递$ companies。

而已!


这只会将键添加到字符串中。值丢失了。
FluffyKitten '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.