【问题标题】:PHP: Split string into 2D arrayPHP:将字符串拆分为二维数组
【发布时间】:2011-02-05 21:35:53
【问题描述】:

我有一个包含相当多数据的字符串。我想将数据拆分为二维数组。字符串中的数据被列分隔为 ~(波浪号),不同行分隔为 :(冒号)。

示例字符串可以是:“London~10~20~cold:New York~23~53~hot:Madrid~43~12~dry”。

谢谢。

【问题讨论】:

标签: php


【解决方案1】:
$string = "London~10~20~cold:New York~23~53~hot:Madrid~43~12~dry";
$array = explode(':', $string);
foreach($array as &$value) $value = explode('~', $value);

【讨论】:

  • 太棒了。谢谢你。如果我的字符串以 ':' 开头,我将如何阻止数组的第一行为空?
  • 要么去掉冒号if ($string[0] == ':') $string = substr($string, 1);,要么去掉空行if (count($array) && !strlen($array[0][0])) $array = array_slice($array, 1);(编辑空不行,改成strlen方法)
【解决方案2】:

功能方式(需要PHP 5.3.x):

$string = "London~10~20~cold:New York~23~53~hot:Madrid~43~12~dry";
$map = array_map(function($el) {
    return explode('~', $el);
}, explode(':', $string));

【讨论】:

    【解决方案3】:

    另一种选择是:

    preg_match_all('/(.*?)~(.*?)~(.*?)~(.*?)(?:$|:)/', $string, $array,
    PREG_SET_ORDER);
    

    更麻烦的是你必须预先定义列格式。它还返回每行 [0] 中的完整匹配项。否则(由于 PREG_SET_ORDER)它是您想要的 2d 格式。

    在这里发布它是为了同时取悦和惹恼微优化器。尽管有常见的 Stackoverflow 模因,但正则表达式比爆炸循环快三倍。

    【讨论】:

    • 不能相信速度。并经过测试。好吧,你是对的。尽管格式不完全正确,因为 $array[x][0] 包含不需要的完整行。此外,我认为您的解决方案可读性较差。无论如何,感谢您指出有关性能...
    【解决方案4】:

    您可以使用explode() 在php 中拆分数据。 所以首先你必须拆分字符串,而不是你必须用explode()再次拆分你的条目。

    $data = explode(':', $string);
    $array = array();
    foreach($data as $d) {
        $d = explode('~', $d);
        $array[] = $d; //e.g. $array[0][0] --> London
        //$array[$d[0]] = array('temperature' => $d[1], 'dont-know' => $d[2], 'climate' => $d[3]); //e.g. $arra['London'] => array(...)
    }
    

    【讨论】:

      【解决方案5】:

      “功能性”风格

      $array = array_map(function($value) {
       return explode('~', $value);
      }, explode(':',$string););
      

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 2012-01-25
        • 2016-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        相关资源
        最近更新 更多