在PHP中将字符串解析为key =>值的数组

时间:2015-05-18 08:17:29

标签: php arrays multidimensional-array

我有一个字符串:

$string = "/key/value/anotherKey/anotherValue/thirdKey/thirdValue"

我想将此字符串解析为key =>的数组值:

array(
    key => value,
    anotherKey => anotherValue,
    thirdKey => thirdValue
);

我找到的唯一解决方案如下,但似乎应该有一种更简单的方法来实现我的目标:

$split = preg_split("[/]", $string, null, PREG_SPLIT_NO_EMPTY);
$i = 0;
$j = 1;
$array = [];
for(;$i<count($split)-1;){
    $array[$split[$i]] = $split[$j];
    $i += 2;
    $j += 2;
}

我看过this SO post,把它只适用于查询字符串,如:

"key=value&anotherKey=anotherValue&thirdKey=thirdValue"

任何人都可以引导我走向更“简单”的解决方案(我的意思是更少编写代码,使用PHP函数,我想阻止使用循环)?谢谢!

5 个答案:

答案 0 :(得分:2)

以下是使用preg_replace()和parse_str()实现此目的的另一种简单方法:

$string = '/key/value/anotherKey/anotherValue/thirdKey/thirdValue';

// Transform to the query string (replace '/key/val' by 'key=val&')
$string = trim(preg_replace('|/([^/]+)/([^/]+)|', '$1=$2&', $string), '&');

// Parse the query string into array variable
parse_str($string, $new_array);
print_r($new_array);

输出:

Array
(
    [key] => value
    [anotherKey] => anotherValue
    [thirdKey] => thirdValue
)

答案 1 :(得分:2)

这应该适合你:

首先我将explode()字符串放入数组中。在这里,我确保使用trim()删除字符串开头和末尾的斜杠,这样我就不会得到空元素。

在此之后我只是array_filter()所有元素都有一个偶数键作为键,所有元素都带有奇数键作为值。

最后我只将array_combine()两个数组合并为一个。

<?php

    $string = "/key/value/anotherKey/anotherValue/thirdKey/thirdValue";
    $arr = explode("/", trim($string, "/"));

    $keys = array_filter($arr, function($k){
        return ($k % 2 == 0);
    }, ARRAY_FILTER_USE_KEY);
    $values = array_filter($arr, function($k){
        return ($k % 2 == 1);
    }, ARRAY_FILTER_USE_KEY);

    $result = array_combine($keys, $values);
    print_r($result);

?>

输出:

Array
(
    [key] => value
    [anotherKey] => anotherValue
    [thirdKey] => thirdValue
)

Demo

对于PHP&lt; 5.6,只需使用array_flip()的解决方法,因为您无法使用array_filter()中的标记:

Demo

答案 2 :(得分:1)

explode它并通过循环生成数组。希望这可以提供帮助 -

$string = "/key/value/anotherKey/anotherValue/thirdKey/thirdValue";

$vars = explode('/', $string);

$i = 0;
$newArray = array();
while ($i < count($vars)) {
   if (!empty($vars[$i])) {
     $newArray[$vars[$i]] = $vars[$i+1];
     $i += 2;
   } else {
     $i++;
   }
}

<强>输出

array(3) {
  ["key"]=>
  string(5) "value"
  ["anotherKey"]=>
  string(12) "anotherValue"
  ["thirdKey"]=>
  string(10) "thirdValue"
}

答案 3 :(得分:1)

您也可以尝试这样

 [akshay@localhost tmp]$ cat test.php
 <?php

 $string = "/key/value/anotherKey/anotherValue/thirdKey/thirdValue";

 $array  = array_flip(explode('/',rtrim(ltrim($string,'/'),'/')));

 print_r( 
          array_combine(
                        array_flip(array_filter($array,function($v){return (!($v & 1)); })),
                        array_flip(array_filter($array,function($v){return ($v & 1);    })) 
                       )
        );

 ?>

<强>输出

 [akshay@localhost tmp]$ php test.php
 Array
 (
     [key] => value
     [anotherKey] => anotherValue
     [thirdKey] => thirdValue
 )

答案 4 :(得分:1)

这与你的要求一样: 看一下这段代码:

<?php
$str = 'key/value/anotherKey/anotherValue/thirdKey/thirdValue';
$list = explode('/', $str);
$result = array();
for ($i=0 ; $i<count($list) ; $i+=2) {
    $result[ $list[$i] ] = $list[$i+1];
}
echo "After Split String".'<pre>';
print_r($result);
echo '</pre>';
?>

<强>输出: -

After Split String
Array
(
    [key] => value
    [anotherKey] => anotherValue
    [thirdKey] => thirdValue
)

如需参考,请点击Demo Example