【问题标题】:How to split string into multiple array in php?如何在php中将字符串拆分为多个数组?
【发布时间】:2019-06-25 14:58:06
【问题描述】:

我有这样的字符串:$string = "1A1R0A",我想将该 $string 拆分为 2 个数组:

array1 ( 
    [0] => 1
    [1] => 1
    [2] => 0
)

array2 (
    [0] => A
    [1] => R
    [2] => A
)

你能帮我做吗?

我试过像这样使用str_split

$subs = str_split($string,1);

但它不起作用,因为它会生成这样的数组:

Array ( 
    [0] => 1 
    [1] => A 
    [2] => 0 
    [3] => R 
    [4] => 1 
    [5] => A 
) 

【问题讨论】:

  • @hann 字母和数字总是交替的吗?只有一个样本字符串,我们只能猜测。

标签: php arrays string split grouping


【解决方案1】:

您可以使用array_filter 过滤数组并保持相同的字符索引和str_split 来实现此目的。然后只需简单地返回字符 is_numeric 与否。

这也将它们的实际索引点保留在原始字符串中。

Live demo.

$str = "1A1R0A";

$arr = (object) array(
    'numeric' => array_filter(str_split($str), function($char) {
        return is_numeric($char);
    }),
    'character' => array_filter(str_split($str), function($char) {
        return !is_numeric($char);
    }),
);

// $arr->numeric will hold numeric values
// $arr->character will hold ascii values

通过维护字符索引,您可以识别数字值在字符串中的位置。

foreach($arr->numeric as $key => $value) {
    $pos = ++$key;
    echo "{$value} is position {$pos} in the String.";
}

【讨论】:

    【解决方案2】:

    您可以使用正则表达式匹配所有后跟非数字的数字模式。

    preg_match_all('/(\d+)(\D+)/', $string, $matches);
    

    您的数字/字母数组将出现在匹配项中。您可以直接在$matches[1]$matches[2] 中使用它们,或者将它们提取为更易读的格式。

    $result = array_combine(['numbers', 'letters'], array_slice($matches, 1));
    

    【讨论】:

      【解决方案3】:
      $string = "1A1R0A";
      $array = str_split($string);
      
      $int_array = [];
      $str_array = [];
      foreach ($array as $char) {
           if (is_numeric($char)) $int_array[] = $char;
           else $str_array[] = $char;
      }
      

      演示here

      【讨论】:

        【解决方案4】:

        preg_match_all() 提供了一种直接的、单一功能的技术,无需循环。

        捕获数字 ($out[1]) 并将字母存储在全字符串匹配 ($out[0]) 中。 $out 中没有不必要的子数组。

        代码:(Demo)

        $string = "1A1R0A";
        var_export(preg_match_all('~(\d)\K\D~', $string, $out) ? [$out[1], $out[0]] : [[], []]);
        
        echo "\n--- or ---\n";
        
        [$letters, $numbers] = preg_match_all('~(\d)\K\D~', $string, $out) ? $out : [[], []];
        var_export($numbers);
        echo "\n";
        var_export($letters);
        

        输出:

        array (
          0 => 
          array (
            0 => '1',
            1 => '1',
            2 => '0',
          ),
          1 => 
          array (
            0 => 'A',
            1 => 'R',
            2 => 'A',
          ),
        )
        --- or ---
        array (
          0 => '1',
          1 => '1',
          2 => '0',
        )
        array (
          0 => 'A',
          1 => 'R',
          2 => 'A',
        )
        

        如果您的字符串可能以字母开头,或者您的字母数字序列不能保证交替出现,您可以使用这种直接技术来分隔两个字符类别。

        代码:(Demo)

        $string = "B1A23R4CD";
        $output = [[], []]; // ensures that the numbers array comes first
        foreach (str_split($string) as $char) {
            $output[ctype_alpha($char)][] = $char;
            //      ^^^^^^^^^^^^^^^^^^- false is 0, true is 1
        }
        
        var_export($output);
        

        输出:

        array (
          0 => 
          array (
            0 => '1',
            1 => '2',
            2 => '3',
            3 => '4',
          ),
          1 => 
          array (
            0 => 'B',
            1 => 'A',
            2 => 'R',
            3 => 'C',
            4 => 'D',
          ),
        )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 2017-11-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多