PHP:简单字符串到数组
我有像PHP:简单字符串到数组,php,arrays,Php,Arrays,我有像var=test这样的字符串;path=test.html 我想转换这些类型的字符串,如下面打印的数组: Array { var => test path => test.html, } 我尝试使用PHP的explode函数执行此任务,但这是将字符串转换为关联数组,然后我决定将该关联数组转换为上面所示的数组 但是我自己的代码不是我想要的,因为它包含2次PHP的explode函数和一些foreach循环,因此我自己的代码对于这样一个简单的任务来说不会处于性能部
var=test这样的字符串;path=test.html
我想转换这些类型的字符串,如下面打印的数组:
Array
{
var => test
path => test.html,
}
我尝试使用PHP的explode函数执行此任务,但这是将字符串转换为关联数组,然后我决定将该关联数组转换为上面所示的数组
但是我自己的代码不是我想要的,因为它包含2次PHP的explode函数和一些foreach循环,因此我自己的代码对于这样一个简单的任务来说不会处于性能部门
非常感谢您的帮助。为此,请使用parse\u str
:
您可以用分号分解,然后用=
分解,然后使用
这个解决方案真的不是那么漂亮,因为它非常冗长。我把它打出来以防万一,但你最好用另一种方法
$s = "var=test;path=test.html";
$b = array_map(function($x){return explode("=", $x); }, explode(";", $s));
$c1 = array_map(function($x){return $x[0]; }, $b);
$c2 = array_map(function($x){return $x[1]; }, $b);
$result = array_combine($c1, $c2);
如何str\u替换
$text = "var=test;path=test.html";
$text = str_replace(';',"\n\t", $text);
$text = str_replace('='," => ", $text);
echo <<<END
Array
{
\t$text
}
END;
$text=“var=test;path=test.html”;
$text=str_replace(“;”,“\n\t”,$text);
$text=str_replace(“=”、“=>”、$text);
echo您可以使用获取一个键数组和一个值数组,然后使用以下命令将它们组合成一个关联数组:
我刚刚通过使用parse_str
php内置函数了解了如何做到这一点
从php.ini文档中:
; List of separator(s) used by PHP to parse input URLs into variables.
; PHP's default setting is "&".
; NOTE: Every character in this directive is considered as separator!
; http://php.net/arg-separator.input
; Example:
;arg_separator.input = ";&"
因此,如果您这样做:
ini_set('arg_separator.input', ';&');
parse_str
应该分解上的两个查询参数代码>和&
。这不应以任何方式影响$\u GET
和$\u POST
的填充,因为它们是在代码执行之前加载的。如果要确保不影响任何其他调用parse_str
的函数的行为,可以使用如下函数:
function my_parse_str($str, &$arr) {
$orig = ini_get('arg_separator.input');
ini_set('arg_separator.input', ';');
parse_str($str, $arr);
ini_set('arg_separator.input', $orig);
}
与先在&
上爆炸,然后再在=
上爆炸相比,有两个优点:
自parse_str()
函数内置以来的最大执行速度
parse_str();或者'a[one]=1&a[two]=2'>array('a'=>array('one'=>1','two'=>2'))
更新-绩效基准
我只是在一个由10000
查询字符串(每个字符串由500
参数组成)组成的数组上运行一个测试,比较普通php拆分与parse_str()
。上面的my_parse_str()
花费了~0.952
秒,而纯php(parseQueryString()
)花费了~4.25
秒
它需要一组更大的数据来测试它到底快了多少,但很明显哪一个赢了:)(如果你想要测试数据+脚本,我将把它们上传到某个地方,因为数据文件是125MB
)。你只需要一个foreach。。我认为没有比这更简单的方法了!做需要的事。问题是,他在用“;”作为变量分隔符,但是parse_str
希望它们被&
分隔。应该有一个php.ini设置,所以他应该能够通过一些ini_get
->ini_set
->restore'&ini_set
,来改变这个设置,但是这看起来不是一个很好的解决方案。在那个链接中,我找到了这个函数:`function parseQueryString($str){$op=array();$pairs=explode(&',$str);foreach($pairs as$pair){list($k,$v)=数组映射(“urldecode”,explode(“=”,$pair));$op[$k]=$v;}返回$op;}`这就是为什么我称它为一个很棒的链接:)=>我刚刚修复了“explode on;”问题,并对这两个函数进行了性能比较:请参见下面我的更新答案。我认为您将Ranbir Kapoor问题中的输出文本误解为字符串。我相信他希望输出是以关联数组的形式…当然你可以eval()
但是是的,我猜(并希望)你误解了问题中的输出文本:)无意义的基准测试和无用的功能,而不仅仅是str_replace。谢谢redShadow,你能将测试和基准测试数据上传到某个地方吗?:)1.我做了一个基准测试,因为他要求的东西“在性能部门的立场”;2.你所说的“只是替换”是什么意思?我认为用str\u replace
无法做到这一点,另外,解析查询字符串的正确方法是使用内置函数parse\u str
@Ranbir我在这里上传了基准脚本:您不需要重新生成input.php(生成所有随机字符串需要相当长的时间),只需将脚本从.php.txt重命名为plain.php并在控制台上运行即可。我添加了第三个基准脚本“regexp.php”,使用preg\u match\u all()
测试答案。。花了11秒钟你才意识到正则表达式虽然看起来很好很干净,但在大多数简单字符串解析/拆分的情况下是最低效的?
function my_parse_str($str, &$arr) {
$orig = ini_get('arg_separator.input');
ini_set('arg_separator.input', ';');
parse_str($str, $arr);
ini_set('arg_separator.input', $orig);
}