【问题标题】:PHP Url string to arrayPHP URL字符串到数组
【发布时间】:2014-08-20 08:29:20
【问题描述】:

我正在尝试找出是否有任何函数可以拆分字符串,例如:

keyword=flower|type=outdoors|colour=red

到数组:

array('keyword' => 'flower', 'type' => 'outdoors', 'colour' => 'red')

目前我构建了一个自定义函数,它使用explode 来首先使用分隔符| 分割元素,然后每个元素都使用赋值符号=,但是可能有一个本机函数可以做到这一点通过指定字符串分隔符开箱即用?

我写的函数是这样的:

public static function splitStringToArray(
    $string = null,
    $itemDivider = '|',
    $keyValueDivider = '='
) {

    if (empty($string)) {

        return array();

    }

    $items = explode($itemDivider, $string);

    if (empty($items)) {

        return array();

    }

    $out = array();

    foreach($items as $item) {

        $itemArray = explode($keyValueDivider, $item);

        if (
            count($itemArray) > 1 &&
            !empty($itemArray[1])
        ) {

            $out[$itemArray[0]] = $itemArray[1];

        }

    }

    return $out;

}

【问题讨论】:

  • 没有。但是,您可以使用parse_str 函数(并将|'s 更改为&'s)在一个衬里中执行此操作:parse_str(str_replace('|', '&', $string), $array);
  • 太棒了 - 您可以将其发布为答案,以便我将其标记为已回答吗?

标签: php arrays string explode


【解决方案1】:
$string = "keyword=flower|type=outdoors|colour=red";
$string = str_replace('|', '&', $string);
parse_str($string, $values);
$values=array_filter($values);   // Remove empty pairs as per your comment
print_r($values);

输出

Array
(
    [keyword] => flower
    [type] => outdoors
    [colour] => red
)

Fiddle

【讨论】:

  • 谢谢 - 我会接受这个答案,这也是 @h2ooooooo 之前以较短格式提出的建议。
  • 哎呀,我对写一个答案很感兴趣,我没有看评论,或者我不会回答,因为你已经有了你的解决方案。
  • @SpencerMark 不用担心 - 这个答案更具描述性,并且有演示和输出。通常,当我的时间较少时,我只是发表快速评论而不是答案。 :)
  • 谢谢大家 - 感谢您的快速回复。
  • 如果你想从最终数组中删除所有空元素,你可以在最后添加这一行。 $values=array_filter($values);
【解决方案2】:

使用正则表达式来解决这个问题。

([^=]+)\=([^\|]+)

http://regex101.com/r/eQ9tW8/1

【讨论】:

  • Regex 在这种情况下似乎有点过头了,你不觉得吗?
【解决方案3】:

问题是您选择的在字符串中表示变量的格式是非标准的。如果您能够将 | 分隔符更改为 & 字符,您将拥有(看起来像)来自 URL 的查询字符串 - 您将能够轻松解析:

$string = "keyword=flower&type=outdoors&colour=red";
parse_str( $string, $arr );
var_dump( $arr );

// array(3) { ["keyword"]=> string(6) "flower" ["type"]=> string(8) "outdoors" ["colour"]=> string(3) "red" }

我建议在源中更改分隔符,而不是手动将其替换为 replace() 或类似的东西(如果可能的话)。

【讨论】:

    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2017-04-15
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    相关资源
    最近更新 更多