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);
    }