【问题标题】:Turn string into multidimensional array using regex使用正则表达式将字符串转换为多维数组
【发布时间】:2013-10-05 12:07:52
【问题描述】:

我想把下面的字符串变成一个数组:

prijs=0,209&orderby=price&order=undefined&posts_per_page=undefined

进入

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

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

数组的数量是可变的。但它总是有 2 层深,就像上面一样。而且只有一个主阵列。

【问题讨论】:

  • 既然您担心性能,您应该添加您当前的代码,这样您就不会从其他人那里得到相同的代码。还添加您可能收到的字符串的变体
  • 我无法发布我的完整代码,因为它超过 300 行 :) 它是一个过滤器模块,它使用太多的 foreach 循环来获得所需的结果......这就是为什么它太慢了,我我正在寻找用其他代码尽可能多地替换循环的解决方案..
  • 在这种情况下,听起来拖累也可能来自其他地方,但无论如何你都可以发布相关部分(你应该)
  • 我知道,但每一个小小的改进都会有所帮助。这就是我被卡住的部分,所以这就是我在 stackoverflow 上问它的原因。

标签: php regex arrays performance multidimensional-array


【解决方案1】:

您不需要 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)

【讨论】:

  • 感谢您的评论!没想到!但目前我正在使用 AJAX 并使用 POST 将字符串发送到 AJAX 页面。目前我们正在将其重建为静态 PHP,所以我会记住这一点!
  • 这看起来是一个不错的解决方案,除了它不会将元素拆分为数组子集。即 prijs = array(0, 209)
  • 很遗憾没有。但是接受的答案3v4l.org/89v3g也没有。我的让你更接近你正在寻找的数组3v4l.org/LYC9b
【解决方案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:你可以使用 preg_split('/,/', $n) 而不是 explode(),因为你提到了 RegEx,看看哪个更适合你

【讨论】:

  • 我对 array_walk 很感兴趣,因为我以前从未使用过它并且喜欢使用闭包。不幸的是,我发现它比使用具有引用值的 foreach 慢。我的测试用例是将数组中的 10,000 个元素乘以 2。这发生在普通数组和“地图”
  • 测试是要走的路,在不知道代码的情况下为您提供了另一种选择。顺便说一句:你也检查过preg_split() 吗?因为众所周知explode() 很慢...
【解决方案3】:
$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);

【讨论】:

  • 尽管我一直在寻找一个没有 foreaches 的解决方案,但这是一种改进,因为您的解决方案只使用了 1 个 foreach,然后我的早期解决方案使用了 2 个 foreach。所以谢谢你:)
  • 如果担心性能,您还应该注意 foreach 中的 2 个函数调用
  • 你为什么拒绝我的回答?
  • vascowhite:可能是因为我在自己的系统中实现之前更改了一些值。 3v4l.org/vhUTRtinyByte:我的错,点击了错误的按钮
【解决方案4】:

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

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

【讨论】:

  • 这不是这样做的,因为我们可以有 order、orderby,也可以有分支等等......
  • @ErikVandeVen:根据你的问题,我已经给你答案了。如果您还必须考虑其他选项,您应该提到它。
  • @ErikVandeVen:请编辑问题并包含您的确切要求并发布您尝试的代码。这将帮助我们更好地回答您的问题。
【解决方案5】:
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);

【讨论】:

  • 感谢您的回答,但正如我在第一篇文章中所写,我正在寻找一种使用更少 foreaches 的方法,然后我已经在使用 :)
  • 好点,但有什么特别的原因你不喜欢 foreach 吗?是为了尽量减少行数吗?
  • 可能是因为处理大数据时循环很慢
  • 正是 CSᵠ,这就是原因。
猜你喜欢
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2021-09-16
  • 1970-01-01
相关资源
最近更新 更多