具有多个定界符的爆炸字符串

时间:2019-07-15 15:54:19

标签: php

我有一个像这样的字符串

$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];
}

我能以更好的方式做到这一点吗?

9 个答案:

答案 0 :(得分:3)

benchmark一点:

  • 5000次迭代
  • Debian Stretch,PHP 7.3
  • 分析的字符串:“ 1-a,2-b,3-c,4-d,5-e,6-f,7-g,8-h,9-i”

exploding string bench

[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 —通过使用一个数组作为键并使用另一个数组作为其值来创建数组

Demo

输出:-

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',
)