【问题标题】:Fastest way to implode an associative array with keys用键内爆关联数组的最快方法
【发布时间】:2010-09-29 07:29:31
【问题描述】:

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

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

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

有没有更快的方法?

【问题讨论】:

  • 别忘了如果你输出的是HTML,正确的语法是&不是 &,这是错误的 JOE 是的,它可以工作,但它是无效的 HTML。

标签: php arrays query-string associative-array implode


【解决方案1】:

您可以使用http_build_query() 来执行此操作。

从提供的关联(或索引)数组生成一个 URL 编码的查询字符串。

【讨论】:

  • 我自己试图在 PHP API 中找到这个方法,这绝对是要走的路。如果不是,另一种方法是使用修改后的内爆方法,例如 uk2.php.net/manual/en/function.implode.php#84684 但 http_build_query() 会更快。
  • 我想知道这是否真的是一般问题的最快方法。此函数中正在进行一些编码。那么,如果不是针对 URL,这真的比 array_walk 快吗?如果您不想对其进行编码怎么办?
  • 问题是http_build_query转义特殊字符
  • 我比较了 serialize()、json_encode() 和 http_build_query()。 http_build_query() 比 serialize() 稍有优势,而 json_encode 是迄今为止最慢的。
  • 它还对特殊字符进行编码,所以这不是一个好的选择
【解决方案2】:

如果您不关心 精确 格式,但是您确实想要一些简单但没有print_r 换行符的东西,您也可以使用json_encode($value) 进行快速简单的格式化输出。 (注意它也适用于其他数据类型

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

【讨论】:

    【解决方案3】:

    顺便说一句,我正在寻找内爆关联数组的最佳方法,但使用我自己的分隔符等...

    所以我使用 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
    

    显然,您可以以某种方式将其保留在自己的函数中,但它让您了解如何使用自己的方法加入关联数组。 希望对某人有所帮助:)

    【讨论】:

    【解决方案4】:

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

    【讨论】:

    • $request_str=print_r($_REQUEST,true); // 为日志文件展平数组
    • 但是以 print_r 格式输出,而不是 key=value 与提供的分隔符连接。
    【解决方案5】:

    这是我的解决方案,例如 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>
    

    【讨论】:

      【解决方案6】:

      我的解决方案:

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

      【讨论】:

        【解决方案7】:

        用于从简单数组创建 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"
        

        【讨论】:

          【解决方案8】:

          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"
          

          【讨论】:

            【解决方案9】:
            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) ;
            

            【讨论】:

              【解决方案10】:

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

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

              【讨论】:

              • 这只会爆破键,不会爆破 key=value 与选定的分隔符!
              【解决方案11】:
              echo implode(",", array_keys($companies->toArray()));
              

              $companies-&gt;toArray()-- 这是以防万一您的 $variable 是一个对象,否则只需传递 $companies。

              就是这样!

              【讨论】:

              • 这只会将键添加到字符串中;值丢失了。
              猜你喜欢
              • 2011-09-17
              • 2016-02-08
              • 2011-03-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-26
              • 1970-01-01
              相关资源
              最近更新 更多