我有一个字符串:
$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函数,我想阻止使用循环)?谢谢!
答案 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
)
对于PHP&lt; 5.6,只需使用array_flip()
的解决方法,因为您无法使用array_filter()
中的标记:
答案 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