如何解决PHP 如何处理 substr 中的字符串?
我在 $str
中存储了一个很长的字符串。现在我执行 $sub = substr($str,$pos)
并且我将只对两个字符串执行读取操作。
长字符串是否仍然只存储在内存中一次,还是被 substr
调用的那一刻拆分?有什么方法可以在 PHP 级别上测试它吗?
解决方法
示例:
<?php
$originalstr = "Lorem ipsum dolor sit amet,consectetur adipiscing elit. Suspendisse et nisl in diam fermentum convallis et sit amet nulla. In at massa ipsum. Vestibulum tempus egestas elit,sollicitudin ullamcorper mauris dictum in. Etiam non mollis velit. Vestibulum tincidunt urna ut posuere placerat. Ut cursus ipsum non ipsum auctor,vitae accumsan sem pretium. Praesent porta vestibulum nisl,a malesuada nisi finibus at. Morbi aliquet vitae ante et porttitor. Donec laoreet nisi ut neque luctus vulputate. Donec sollicitudin massa at turpis lobortis laoreet. Etiam porta lacinia placerat. Aenean venenatis dui quis elit facilisis porta. Donec vel semper odio. Vivamus mauris neque,egestas ac mi ac,rutrum dignissim dui. Fusce consectetur eleifend luctus. Vestibulum accumsan rutrum magna iaculis tempus. Lorem ipsum dolor sit amet,consectetur adipiscing elit. Donec eget arcu sodales,porttitor magna nec,scelerisque purus."; // the string
$substr = substr($originalstr,50);
echo $substr. "<br><hr><br>". $originalstr; //prints the first 50 characters; and then prints the actual string
?>
输出:
Lorem ipsum dolor sat amet,consectetur adipiscing
Lorem ipsum dolor 坐 amet,consectetur adipiscing 精英。 Suspendisse et nisl in diamfermentum convallis et sat amet nulla。在马萨 ipsum。 Vestibulum tempus egestas elit,sollicitudin ullamcorper mauris dictum in. Etiam non mollis velit。前庭 tincidunt urna ut posuere placerat。 Ut cursus ipsum non ipsum actor,vitae accumsan sem pretium。 Praesent 前庭门 nisl,一个malesuada nisi finibus 在。 Morbi aliquet vitae ante et porttitor。 Donec laoreet nisi ut neque luctus vulputate。 Donec sollicitudin massa 在 turpis lobortis laoreet。 Etiam porta lacinia placerat。 Aenean venenatis dui quis elit facilisis porta。 Donec vel semper odio。 Vivamus mauris neque、egestas ac mi ac、rutrum dignissim dui。 Fusce consectetur eleifend luctus。 Vestibulum accumsan rutrum magna iaculis tempus。 Lorem ipsum dolor 坐 amet,consectetur adipiscing 精英。 Donec eget arcu sodales,porttitor magna nec,scelerisque purus。
substr
(PHP 4、PHP 5、PHP 7、PHP 8)
substr — 返回字符串的一部分 描述 ¶ substr ( string $string,int $offset,int|null $length = null ) : string
返回由偏移量和长度参数指定的字符串部分。 参数¶
字符串
输入字符串。 偏移
如果 offset 为非负数,则返回的字符串将从 string 中第 offset'th > 个位置开始,从零开始计数。例如,在字符串 'abcdef' 中,> 位置 0 的字符是 'a',位置 2 的字符是 'c',依此类推。
如果 offset 为负数,则返回的字符串将从字符串末尾的第 offset 个字符开始。
如果字符串长度小于偏移字符,则返回false。
示例 #1 使用负偏移
<?php
$rest = substr("abcdef",-1); // returns "f"
$rest = substr("abcdef",-2); // returns "ef"
$rest = substr("abcdef",-3,1); // returns "d"
?>
长度
如果给定长度并且为正数,则返回的字符串最多包含>length 个字符,从偏移量开始(取决于字符串的长度)。
如果给定 length 并且为负数,那么从字符串末尾开始(在 >offset 为负时计算起始位置之后)将省略许多字符。如果 offset 表示此截断的位置或超出的位置,则返回 >false。
如果给定长度并且为 0、false 或 null,将返回一个空字符串。
如果省略length,则返回从offset开始到>string结尾的子串。
示例 #2 使用负长度
<?php
$rest = substr("abcdef",-1); // returns "abcde"
$rest = substr("abcdef",2,-1); // returns "cde"
$rest = substr("abcdef",4,-4); // returns false
$rest = substr("abcdef",-1); // returns "de"
?>
返回值¶
返回提取的字符串部分;或失败时为 false,或空的 >string。
我认为他们根本没有提到任何关于内存的事情。因此,您需要在运行 PHP 应用程序时测试内存使用量峰值。
他们提到: 如果给定长度并且为正数,则返回的字符串最多包含>length 个字符,从偏移量开始(取决于字符串的长度)。
但出于常识,他们可能将其设计为仅从该变量中获取前几个字符,然后在达到 $pos
时停止执行。
玩得开心 cod3ing!
,对于 PHP 级别:这是一个示例,您可以在任何在线 PHP 编译器上对其进行测试。
该示例将向您展示字符串将保持不变,只有子字符串是新字符串(0:开始索引,5:结束索引)。
如果您有其他问题或不清楚的查询,请随时再问我。
<?php
$txt = "test_string_in_php_demo"; //string
$sub = substr($txt,5);
echo $sub; //prints the sub string from start to index 5
echo "<br>";
echo "<br>";
echo $txt; // prints the full txt;
?>
输出:
测试_
test_string_in_php_demo
额外资源:
Please Check this question Too.
Handling large strings in PHP.
我刚刚找到了 memory_get_usage 函数:
echo memory_get_usage()."<br>"; // 391544
$str = file_get_contents("data.bin"); // 500 kb
echo memory_get_usage()."<br>"; // 961000
$sub = substr($str,100000);
echo memory_get_usage()."<br>"; // 1432040
unset($sub);
echo memory_get_usage()."<br>"; // 961000
unset($str);
echo memory_get_usage()."<br>"; // 391656
从测试中可以看出,PHP这里根本没有优化内存管理!好难过。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。