【问题标题】:Why explode by space not work in some space string为什么按空间爆炸在某些空间字符串中不起作用
【发布时间】:2019-11-26 06:33:02
【问题描述】:
2   2019-11-21 21:51:24 0   1
1   2019-11-25 13:32:06 0   1
1   2019-11-25 13:36:31 0   1
1234    2019-11-25 13:38:55 0   1

我有来自上述网站的输出数据,然后我想像这样将这些数据分解为数组输出,Array ( [0] => 2 [1] => 2019-11-21 [2] => 21:51:24 [3] => 0 [4] => 1 1 [5] => 2019-11-25 [6] => 13:32:06 [7] => 0 [8] => 1 1 [9] => 2019-11-25 [10] => 13:36:31 [11] => 0 [12] => 1 1234 [13] => 2019-11-25 [14] => 13:38:55 [15] => 0 [16] => 1 );

但是当我尝试像

这样运行输出时
Array
(
    [0] => 2    2019-11-21
    [1] => 21:51:24 0   1
    [2] => 
    [3] => 1    2019-11-25
    [4] => 13:32:06 0   1
    [5] => 
    [6] => 1    2019-11-25
    [7] => 13:36:31 0   1
    [8] => 
    [9] => 1234 2019-11-25
    [10] => 13:38:55    0   1
)

为什么有些空间没有爆炸?

【问题讨论】:

  • 用空格替换\n(换行)或多个空格,然后用空格爆炸
  • 没有工作,输出Array ( [0] => 2 2019-11-21 [1] => 21:51:24 0 1 [2] => [3] => 1 2019-11-25 [4] => 13:32:06 0 1 [5] => [6] => 1 2019-11-25 [7] => 13:36:31 0 1 [8] => [9] => 1234 2019-11-25 [10] => 13:38:55 0 1 ) 仍有空间未爆炸
  • 在 2 2019-11-21 之间两个使用制表符空格然后尝试用 \t 替换空格
  • 如果它看起来和闻起来像 CSV,则视为 CSV。您想要的数组看起来比数组数组(记录数组)更难处理和使用。

标签: php arrays explode


【解决方案1】:

首先你需要用单个空格替换多个空格,然后对结果执行explode

$string = '2   2019-11-21 21:51:24 0   1';
$singleSpace = preg_replace('!\s+!', ' ', $string);
$explodeData = explode(" ",$singleSpace);

【讨论】:

    【解决方案2】:

    请尝试以下代码。它正在工作。

    echo "<pre>";
    
    $data = '2   2019-11-21 21:51:24 0   1
    1   2019-11-25 13:32:06 0   1
    1   2019-11-25 13:36:31 0   1
    1234    2019-11-25 13:38:55 0   1';
    
    $newData = explode(" ",str_replace(PHP_EOL," ",$data));
    foreach($newData as $k => $v) {
        if($v == null) {
            unset($newData[$k]);
        }
    }
    
    print_r(array_values($newData));
    

    以上代码的输出为:

     Array
    (
        [0] => 2
        [1] => 2019-11-21
        [2] => 21:51:24
        [3] => 0
        [4] => 1
        [5] => 1
        [6] => 2019-11-25
        [7] => 13:32:06
        [8] => 0
        [9] => 1
        [10] => 1
        [11] => 2019-11-25
        [12] => 13:36:31
        [13] => 0
        [14] => 1
        [15] => 1234
        [16] => 2019-11-25
        [17] => 13:38:55
        [18] => 0
        [19] => 1
    )
    

    【讨论】:

      【解决方案3】:

      它们不是空格而是制表符。我希望这是四个制表符分隔的字段。

      $tsv = <<<"CSV"
      2\t2019-11-21 21:51:24\t0\t1
      1\t2019-11-25 13:32:06\t0\t1
      1\t2019-11-25 13:36:31\t0\t1
      1234\t2019-11-25 13:38:55\t0\t1
      CSV;
      
      echo $tsv, "\n\n";
      
      foreach(explode("\n", $tsv) as $line) {
          var_dump(explode("\t", $line));
      }
      

      如果您加载文件,您可以将分隔符提供给fgetcsv

      $fh = fopen($file, 'rb');
      while($line = fgetcsv($fh, 0, "\t")) {
          var_dump($line);
      }
      

      【讨论】:

        【解决方案4】:
        $data = "2   2019-11-21 21:51:24 0   1";
        $output = preg_replace('/\s+/',' ', $data);
        $data = explode(" ",$output);
        print_r($data);
        

        【讨论】:

          猜你喜欢
          • 2015-09-11
          • 1970-01-01
          • 2011-07-20
          • 1970-01-01
          • 1970-01-01
          • 2013-05-26
          • 1970-01-01
          • 2013-07-28
          • 2019-12-16
          相关资源
          最近更新 更多