我有一个像这样的字符串
$str = "1-a,2-b,3-c";
我想将其转换成这样的单个数组
$array = [
1 => "a",
2 => "b",
3 => "c"
];
我做什么
$str = "1-a,2-b,3-c";
$array = [];
$strex = explode(",", $str);
foreach ($strex as $str2) {
$alphanumeric = explode("-", $str2);
$array[$alphanumeric[0]] = $alphanumeric[1];
}
我能以更好的方式做到这一点吗?
答案 0 :(得分:3)
benchmark一点:
[edit]更新了最后2个提案[/ edit]
答案 1 :(得分:2)
您可以使用preg_match_all
:
<?php
$str = "1-a,2-b,3-c";
preg_match_all('/[0-9]/', $str, $keys);
preg_match_all('/[a-zA-Z]/', $str, $values);
$new = array_combine($keys[0], $values[0]);
echo '<pre>'. print_r($new, 1) .'</pre>';
我们在这里使用您的字符串,explode()
,然后使用模式preg_match_all
$value
:
/[0-9]/
->数值/[a-zA-Z]/
->字母然后使用array_combine
将其放入一个数组
感谢u_mulder,可以进一步缩短此时间:
<?php
$str = "1-a,2-b,3-c";
preg_match_all('/(\d+)\-([a-z]+)/', $str, $matches);
$new = array_combine($matches[1], $matches[2]);
echo '<pre>'. print_r($new, 1) .'</pre>';
答案 2 :(得分:1)
您可以将preg_split与array_filter和array_combine一起使用,
function odd($var)
{
// returns whether the input integer is odd
return $var & 1;
}
function even($var)
{
// returns whether the input integer is even
return !($var & 1);
}
$str = "1-a,2-b,3-c";
$temp = preg_split("/(-|,)/", $str); // spliting with - and , as said multiple delim
$result =array_combine(array_filter($temp, "even", ARRAY_FILTER_USE_KEY),
array_filter($temp, "odd",ARRAY_FILTER_USE_KEY));
print_r($result);
array_filter-使用回调函数过滤数组的元素
注意:- ARRAY_FILTER_USE_KEY -将键作为唯一的参数传递给回调,而不是值
array_combine —通过使用一个数组作为键并使用另一个数组作为其值来创建数组
输出:-
Array
(
[1] => a
[2] => b
[3] => c
)
答案 3 :(得分:1)
与array_map()
相关的一种方法,
<?php
$my_string = '1-a,2-b,3-c';
$my_array = array_map(function($val) {list($key,$value) = explode('-', $val); return [$key=>$value];}, explode(',', $my_string));
foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($my_array)) as $k=>$v){
$result[$k]=$v;
}
print_r($result);
?>
工作演示: https://3v4l.org/aYmOH
答案 4 :(得分:1)
不是更好的方法,而是另一个示例:
jupyter notebook --generate-config
答案 5 :(得分:1)
代币一路下跌...
<?php
$str = '1-a,2-b,3-c';
$token = '-,';
if($n = strtok($str, $token))
$array[$n] = strtok($token);
while($n = strtok($token))
$array[$n] = strtok($token);
var_export($array);
输出:
array (
1 => 'a',
2 => 'b',
3 => 'c',
)
如果没有第一个条件,则可能更简洁:
$array = [];
while($n = $array ? strtok($token) : strtok($str, $token))
$array[$n] = strtok($token);
答案 6 :(得分:1)
必填单线(您的里程可能会有所不同):
<?php
parse_str(str_replace([',', '-'], ['&', '='], '1-a,2-b,3-c'), $output);
var_export($output);
输出:
array (
1 => 'a',
2 => 'b',
3 => 'c',
)
答案 7 :(得分:1)
这会像OP上的逗号一样爆炸字符串,从而形成对(1-a)和(2-b)等,然后爆炸这些对。最后,使用array_column创建关联的数组:
<?php
$str = '1-a,2-b,3-c';
$output =
array_column(
array_map(
function($str) { return explode('-', $str); },
explode(',', $str)
),
1,
0
);
var_export($output);
输出:
array (
1 => 'a',
2 => 'b',
3 => 'c',
)
答案 8 :(得分:1)
您可以对,和-进行一次拆分,然后遍历其他每对进行迭代($ k&1是对奇数索引的检查):
<?php
$str = '1-a,2-b,3-c';
foreach(preg_split('/[,-]/', $str) as $k=>$v) {
$k&1 && $output[$last] = $v;
$last = $v;
}
var_export($output);
输出:
array (
1 => 'a',
2 => 'b',
3 => 'c',
)
preg_split数组如下所示:
array (
0 => '1',
1 => 'a',
2 => '2',
3 => 'b',
4 => '3',
5 => 'c',
)