2009-01-02 41 views
93

我正在寻找一种将关联数组转换为字符串的快速方法。典型的结构就像一个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别忘了,正确的语法是& not&,iow这是错的JOE是的,它的工作原理,但它是无效的HTML。 – TravisO 2009-01-06 18:21:12

回答

143

您可以使用http_build_query()来做到这一点。

生成从缔合(或索引)阵列提供的URL编码的查询串。

+0

正试图在PHP API中找到这个方法,这绝对是一种方法。如果不是替代方案是使用修改后的implode方法,例如http://uk2.php.net/manual/en/function.implode.php#84684,但http_build_query()会更快。 – 2009-01-02 21:11:44

+0

我不知道这是否真的是一般问题的最快方式。这个函数中有一些编码正在进行。所以,如果它不是一个URL,这是否比array_walk更快,以及如果你不想编码? – 2014-01-31 23:12:52

+5

问题是'http_build_query`转义特殊字符 – Sisyphus 2015-02-09 15:42:46

32

顺便说一句,我是在搜索,寻找到爆的关联数组,但用自己的分隔符等的最佳方式...

所以,我没有这个使用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 

显然,你可以坚持在自己的函数莫名其妙,但它给你的,你怎么能一个想法使用你自己的方法加入一个关联数组。 希望帮助别人:)

-1

这是最基本的版本,我能想到的:

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

一种方法是使用print_r(array, true),它将返回数组

22

如果你的字符串表示不关心确切的格式,但是您确实想要一些简单但没有print_r的换行符,您还可以使用json_encode($value)来获得快速简单的格式化输出。 (注它的工作原理以及对其他数据类型也

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

这是我的,例如解决方案的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> 
0
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) ; 
-3
echo implode(",", array_keys($companies->toArray())); 

$companies->toArray() - 这仅仅是假如你的$variable是一个对象,否则只是通过$公司。

就是这样!

0

一个班轮为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"