在特定索引处从字符串中删除字符的最快方法是什么?

时间:2017-05-04 00:14:20

标签: php arrays string

我之前使用以下命令从字符串中删除了charactors:

$str[$position] = '';

我需要多次这样做并循环:

while ($condition == true)
{
     $str[$position++] = '';
     // My code
}

代码运行完美且效率非常高,但是,现在我已经升级到PHP 7.1.4了。

如果我使用:

while ($condition == true)
{
     $str[$position++] = ' ';
     // My code
}

它有效,但我得到了不需要的空间。

我可以使用substr_replace来完成这项工作,但效率极低。什么是解决问题的最快最有效的方法,以及为什么它不适用于PHP 7.1.4?

修改

我修复了使用substr_replace升级PHP后停止工作的代码。首先,tcPeng表示正确:

  

如果将空字符串分配给字符串偏移量,则应引发警告并且不应修改字符串

因为这是我遇到的确切问题。但是,在我的代码中的其他地方,我有:

while (trim($file[$i]) !== 'default:')
    $file[$i++] = '';

当然,该代码也不再适用。奇怪的是,它确实有效。为什么它有用,我在更改代码以使用substr_replace时有什么意义吗?

我必须使用substr_replace修复的代码和恰好仍然有效的代码之间的唯一区别是我必须修复的代码,字符串是数组的元素,并且正在输出echo。使用仍然有效的代码,我将其保存为file_put_contents

1 个答案:

答案 0 :(得分:1)

在php7.1中,如果为字符串偏移量指定一个空字符串,则应该引发警告并且不应该修改该字符串。

https://bugs.php.net/bug.php?id=71572

因此,如果要删除字符串中的特定索引,请尝试以下操作:

$a = 'hello';
$a = substr($a, 0, 1) . substr($a, 2, 5);
var_dump($a);    // string(4) "hllo"

或者这可能更有效:

$a = 'hello';
$a = substr_replace($a, '', 1, 1);
var_dump($a);    // string(4) "hllo"

在php5或php7.0中,如果你使用$a[1] = '',字符串$a是这样的:

$a = 'hello';
$a[1] = '';
var_dump($a);    // string(5) "h\000llo"

字符串$a的索引1替换为空值\000。它实际上并没有删除。因此,如果您想获得hllo,则索引分配不是一个好的选择。

希望这会有所帮助...