在数组中将两个元素列表拆分为键值对

8
我想要展开像这样的多行字符串。
color:red
material:metal

将其转换为如下数组
$array['color']=red
$array['material']=metal

有什么想法吗?
3个回答

17
使用explode(),你可以使用正则表达式,但是没有必要,这个方法足够简单而不会增加额外的负担。
$data = array();
foreach (explode("\n", $dataString) as $cLine) {
    list ($cKey, $cValue) = explode(':', $cLine, 2);
    $data[$cKey] = $cValue;
}

如评论中所提到的,如果数据来自Windows/DOS环境,很可能会有CRLF换行符。在foreach()之前添加以下代码行可以解决这个问题。
$dataString = str_replace("\r", "", $dataString); // remove possible \r characters

使用正则表达式的替代方法可以非常愉快,使用preg_match_all()array_combine()函数:
$matches = array();
preg_match_all('/^(.+?):(.+)$/m', $dataString, $matches);
$data = array_combine($matches[1], $matches[2]);

不要忘记至少从 $cValue 中去除可能的 "\r" - Jon
@Jon 说得对,已经根据那个改变进行了修改,并添加了一个相当愉快的正则表达式版本。 - Orbling

2

试一下

$value = '1|a,2|b,3|c,4|d';
$temp = explode (',',$value);
foreach ($temp as $pair) 
{
    list ($k,$v) = explode ('|',$pair);
    $pairs[$k] = $v;
}

print_r($pairs);

1

首先按换行符进行分割。可能是 \n

然后对每个生成的数组项按 : 进行分割,并将新的键/值设置为该项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接