这个问题的答案为我指明了一个可能的方向,但它处理了一次字符串,然后循环遍历结果。有没有办法在一个过程中做到这一点?
我的字符串是这样的,但要长得多:
954_adhesives 7_air fresheners 25_albums 236_stuffed_animial 819_antenna toppers 69_appliances 47_aprons 28_armbands
我想在换行符上拆分它,然后在下划线上拆分,以便下划线之前的数字是键,下划线之后的短语是值。
只需使用正则表达式和array_combine
:
preg_match_all('/^([0-9]+)_(.*)$/m', $input, $matches);
$result = array_combine($matches[1], array_map('trim', $matches[2]));
样本输出:
array(8) {
[954]=>
string(9) "adhesives"
[7]=>
string(14) "air fresheners"
[25]=>
string(6) "albums"
[236]=>
string(15) "stuffed_animial"
[819]=>
string(15) "antenna toppers"
[69]=>
string(10) "appliances"
[47]=>
string(6) "aprons"
[28]=>
string(8) "armbands"
}
编辑:
对于后代,这是我的解决方案。但是,@Niels Keurentjes 的答案更合适,因为它在开头匹配一个数字。
如果您想使用正则表达式执行此操作,您可以执行以下操作:
preg_match_all("/^(.*?)_(.*)$/m", $content, $matches);
应该做的伎俩。
您可以在一行中完成:
$result = preg_split('_|\n',$string);
这是一个方便的花花公子测试仪:http ://www.fullonrobotchubby.co.uk/random/preg_tester/preg_tester.php
如果您希望结果是这样的嵌套数组;
Array
(
[0] => Array
(
[0] => 954
[1] => adhesives
)
[1] => Array
(
[0] => 7
[1] => air fresheners
)
[2] => Array
(
[0] => 25
[1] => albums
)
)
那么你可以使用array_map
例如;
$str =
"954_adhesives
7_air fresheners
25_albums";
$arr = array_map(
function($s) {return explode('_', $s);},
explode("\n", $str)
);
print_r($arr);
为了简洁起见,我刚刚使用了字符串的前三行,但相同的函数在整个字符串上都可以正常工作。