使用正则表达式将字符串转换为多维数组

时间:2013-10-05 12:07:52

标签: php regex arrays performance multidimensional-array

我想将以下字符串转换为数组:

  

prijs = 0209&安培;的OrderBy =价格与秩序=未定义&安培; posts_per_page =未定义

INTO

array(
  [prijs] => Array
        (
            [0] => 0
            [1] => 209
        )
  [orderby] => Array
        (
            [0] => price
        )
  [order] => Array
        (
            [0] => undefined
        )  
  [posts_per_page] => Array
        (
            [0] => undefined
        )  
)

这样的事情。这可能吗?
现在我正在使用一些foreach循环,但这并不像RegEx那样快速和理想 这是一个需要尽可能快地加载的脚本,因此代码中的每一点改进都可能有所帮助。

数组的数量可以是变量。但它总是两层深,如上所述。只有一个主阵列。

5 个答案:

答案 0 :(得分:3)

您不需要REGEX。您显示的字符串看起来像一个URL查询字符串,在这种情况下$ _GET已经包含您需要的值: -

var_dump($_GET);

应该给你: -

array (size=4)
  'prijs' => string '0,209' (length=5)
  'orderby' => string 'price' (length=5)
  'order' => string 'undefined' (length=9)
  'posts_per_page' => string 'undefined' (length=9)

否则您可以使用parse_string()

$values = array();
parse_str('prijs=0,209&orderby=price&order=undefined&posts_per_page=undefined', $values);
var_dump($values);

<强>输出:

array (size=4)
  'prijs' => string '0,209' (length=5)
  'orderby' => string 'price' (length=5)
  'order' => string 'undefined' (length=9)
  'posts_per_page' => string 'undefined' (length=9)

答案 1 :(得分:2)

看起来你需要array_walk,因为它应该比foreach更快,即使它在较低级别执行的操作几乎相同。

vascowhite建议您可以使用$_GET,或parse_str()获取初始array,之后:

array_walk($array, function(&$n) { 
  $n = explode(',', $n); 
}); 

直播代码:http://3v4l.org/YfuKs

完全符合您的要求(始终使用数组而不是CSV字符串):

Array
(
    [prijs] => Array
        (
            [0] => 0
            [1] => 209
        )

    [orderby] => Array
        (
            [0] => price
        )

    [order] => Array
        (
            [0] => undefined
        )

    [posts_per_page] => Array
        (
            [0] => undefined
        )

)

PS:您可以使用explode()而不是preg_split('/,/', $n),因为您提到了RegEx并查看哪一个更快

答案 2 :(得分:1)

嗯,你可以使用这样的东西:

    <?php
    parse_str("prijs=0,209&orderby=price&order=undefined&posts_per_page=undefined",$myArray);
    $myArray['prijs'] = explode(",", $myArray['prijs']);
    $myArray['orderby'] = explode(",", $myArray['orderby']);
    $myArray['order'] = explode(",", $myArray['order']);
    $myArray['posts_per_page'] = explode(",", $myArray['posts_per_page']);
    print_r($myArray);
    ?>

答案 3 :(得分:1)

$str = 'prijs=0,209&orderby=price&order=undefined&posts_per_page=undefined';

$array = preg_split('/[&]/' , $str);

foreach ($array as $a)
{
    $a = preg_split('/[=]/' , $a);
    $a[1] = preg_split('/[,]/' , $a[1]);
}

var_dump($array);

答案 4 :(得分:0)

function urlSplitter($input)
{
    $step1Array = explode('&', $input);
    $result = array();

    foreach($step1Array as $element)
    {
        $parts = explode("=", $element);
        $result[$parts[0]] = explode(",", $parts[1]);
    }

    return $result;
}

$result = urlSplitter("prijs=0,209&orderby=price&order=undefined&posts_per_page=undefined");
var_dump($result);