【问题标题】:String concatenation vs array implode in PHPPHP中的字符串连接与数组内爆
【发布时间】:2010-12-23 06:32:03
【问题描述】:

我使用 Java 已经很长时间了,我逐段创建长字符串的标准方法是将元素添加到数组中,然后对数组进行内爆。

$out[] = 'a';
$out[] = 'b';
echo implode('', $out);

但随后有大量数据。

(标准 PHP)替代方法是使用字符串连接。

$out = 'a';
$out .= 'b';
echo $out;

令我惊讶的是,这两种方法似乎没有速度差异。当存在显着的时间差异时,通常是串联看起来更快,但并非总是如此。

所以我的问题是:除了样式和代码可读性之外,还有其他理由选择一种方法而不是另一种方法吗?

【问题讨论】:

  • PHP 不是 Java。所以不要对它们的不同感到惊讶。
  • 在 PHP 中,字符串不是不可变的,甚至不是对象。

标签: php arrays string


【解决方案1】:

对我来说,使用数组意味着您将要做一些简单的字符串连接无法完成的事情。像排序、检查唯一性等。如果你不做类似的事情,那么字符串连接在一两年内会更容易被不知道代码的人阅读。他们不必怀疑阵列是否会在爆炸前被操纵。

也就是说,当我需要用逗号或单词之间的“和”构建字符串时,我会采用内爆数组方法。

【讨论】:

    【解决方案2】:

    选择更易读的一个。总是。这种情况下,我会选择第二个方法。 然后优化它,如果它是一个瓶颈。

    【讨论】:

    • 不,这不是瓶颈,只是好奇。无论如何,我已经提到了可读性。
    • 我只能同意这一点 - 永远不要做任何事情,因为微基准显示它快 0.0001%。使用 XDebug 或 zendDebugger 有用于 PHP 的分析器,如果这还不够,那么还有一些方法可以分析 PHP 运行时,花费在那里的时间比维护“优化​​”代码更好(而且通常运行更多的硬件比运行更多的硬件更便宜)支付开发商)
    • +1 只选择最合适的一个。如果implode优雅地解决了问题,请使用它。
    【解决方案3】:

    在生成以字符分隔的字符串时,一个(细微的)差异清晰可见:

    <?php
    $out[] = 'a';
    $out[] = 'b';
    echo implode(',', $out);
    
    foreach($out as $o) {
        echo $o . ',';
    }
    
    ?>
    

    第一个将打印a,b,而后者将打印a,b,。因此,除非您像在示例中那样使用空字符串作为分隔符,否则通常首选使用 implode()

    【讨论】:

    • 可以这样做:$first = true; foreach ($out as $o) { if ($first) $first = false;否则回显',';回声$o;这应该给你 a,b 代替。
    • @Raney:为什么implode() 的方式更简单时所有的麻烦?
    【解决方案4】:

    抛开串联vs-内爆圣战:不,没有区别。

    【讨论】:

      【解决方案5】:

      这取决于你想对字符串/数组做什么以及你如何创建它

      如果你从一个数组开始并需要对其进行排序/操作某些元素,那么我建议内爆

      除此之外我通常使用连接

      【讨论】:

        【解决方案6】:

        以下是两种方法的性能测试:

        <?php
        
        const M = 1000000;
        
        // Imploding method
        $start = microtime(true);
        $arr = [];
        for ($i = 0; $i < M; $i++) {
            $arr[] = chr(65 + ($i & 0x7));
        }
        $str1 = implode('', $arr);
        $time1 = microtime(true) - $start;
        
        // Concatenation method
        $start = microtime(true);
        $str2 = '';
        for ($i = 0; $i < M; $i++) {
            $str2 .= chr(65 + ($i & 0x7));
        }
        $time2 = microtime(true) - $start;
        
        assert( $str1 == $str2 ); 
        echo "Time 1: $time1\n";
        echo "Time 2: $time2\n";
        

        在 MacOS 上使用 PHP 7.1.33 输出:

        Time 1: 0.121246
        Time 2: 0.059228
        

        在(慢)Debian 上使用 PHP 8.0.5 输出:

        Time 1: 0.88076496124268
        Time 2: 0.8109610080719
        

        因此,连接方法的工作速度更快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-09
          • 1970-01-01
          • 2020-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多