PHP中的字符串连接与数组内爆

时间:2009-12-04 14:40:43

标签: php arrays string

长期使用Java我的标准方法是逐个创建长字符串,将元素添加到数组中,然后内爆数组。

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

但随后有大量数据。

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

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

令我惊讶的是,两种方法之间似乎没有速度差异。当存在显着的时间差时,通常连接似乎更快,但不是所有时间。

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

6 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

foreach($out as $o) {
    echo $o . ',';
}

?>

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

答案 3 :(得分:2)

除了串联与内爆的圣战之外:不,没有区别。

答案 4 :(得分:0)

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

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

除了我通常使用串联

答案 5 :(得分:0)

这是两种方法的性能测试:

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

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